Вопрос

Мне нужно вставить значения в новый столбец в нашей базе данных, но я не могу заставить себя делать это последовательно.Данных очень много, поэтому о том, чтобы делать что-либо вручную, в значительной степени не может быть и речи.Позвольте мне подготовить почву:

У нас есть таблица с именем Occurence и таблица с именем OccurenceBuckets, где каждое вхождение ссылается на сегмент, которому оно было присвоено.Ранее это была односторонняя ссылка, но по разным причинам мы решили добавить обратную ссылку из списка вхождений к первому вхождению (то есть первому по времени).Таблицы теперь выглядят следующим образом:

CREATE TABLE Occurrence
  OccurrenceID uniqueidentifier,
  OccurrenceBucketID uniqueidentifier,
  OccurrenceTime datetime,
  OccurrenceMessage nvarchar
  ...other meta data...

CREATE TABLE OccurrenceBucket
  OccurrenceBucketID uniqueidentifier,
  ...other meta data...
  FirstOccurrenceID uniqueidentifier,
  FirstOccurrenceTime datetime,
  FirstOccurrenceMessage nvarchar

Я ищу способ определить первое вхождение, принадлежащее корзине, и присвоить FirstOccurrenceID, FirstOccurrenceTime и FirstOccurrenceMessage со значениями из этого первого вхождения для всех моих вхождений.

У кого-нибудь из вас, экспертов по sql-fu, есть время, чтобы помочь мне, поскольку все мои попытки, как видно, приводят к неправильному или неполному выбору вхождений.

Это было полезно?

Решение

Вы можете попробовать это

DECLARE @Occurrence TABLE(
        OccurrenceID INT,
        OccurrenceBucketID INT,
        OccurrenceTime DATETIME,
        OccurrenceMessage VARCHAR(MAX)
)

INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 1, 1, '01 Jan 2009', 'A'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 2, 1, '02 Jan 2009', 'B'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 3, 1, '03 Jan 2009', 'C'


INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 4, 2, '04 Jan 2009', 'D'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 5, 2, '05 Jan 2009', 'E'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)  
SELECT 6, 2, '06 Jan 2009', 'F'

SELECT * FROM @Occurrence

DECLARE @OccurrenceBucket TABLE(
        OccurrenceBucketID INT,
        FirstOccurrenceID INT,
        FirstOccurrenceTime DATETIME,
        FirstOccurrenceMessage VARCHAR(MAX)
)

INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 1
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 2

SELECT * FROM @OccurrenceBucket


UPDATE  @OccurrenceBucket
SET     FirstOccurrenceID = OccurrenceID,
        FirstOccurrenceTime = OccurrenceTime,
        FirstOccurrenceMessage = OccurrenceMessage
FROM    @OccurrenceBucket oc INNER JOIN
        (
            SELECT  o.*
            FROM    @Occurrence o INNER JOIN
                    (
                        SELECT  OccurrenceBucketID,
                                MIN(OccurrenceID) FirstOccurrenceID
                        FROM    @Occurrence
                        GROUP BY OccurrenceBucketID
                    ) Mins ON o.OccurrenceID = mins.FirstOccurrenceID
        ) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID

SELECT * FROM @OccurrenceBucket

Редактировать:

UPDATE  @OccurrenceBucket 
SET     FirstOccurrenceID = OccurrenceID, 
        FirstOccurrenceTime = OccurrenceTime, 
        FirstOccurrenceMessage = OccurrenceMessage 
FROM    @OccurrenceBucket oc INNER JOIN 
        ( 
                SELECT  o.* 
                FROM    @Occurrence o INNER JOIN 
                                ( 
                                        SELECT  OccurrenceBucketID, 
                                                        MIN(OccurrenceTime) FirstOccurrenceTime 
                                        FROM    @Occurrence 
                                        GROUP BY OccurrenceBucketID 
                                ) Mins ON o.OccurrenceTime = mins.FirstOccurrenceTime 
        ) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID 

Другие советы

Ну, чтобы найти первое вхождение в корзине, разве не должна работать следующая работа?

SELECT TOP 1
  OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
  OccurranceBucketID = @OccurranceBucketID
ORDER BY
  OccurranceTime ASC

Вы можете назначить возвращенные поля переменным, а затем соответствующим образом обновить OccurranceBucket.

Примечание: «вхождение» не имеет "а" в нем.

Этот ответ основан на уникальности OccurrenceTime для каждого вхождения: -

обновить набор OccBuck
OccBuck.FirstOccurrenceID = Occ.OccurrenceID,
OccBuck.FirstOccurrenceTime = Occ.OccurrenceTime,
OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage
от
dbo.OccurrenceBucket as OccBuck
внутреннее соединение dbo.Occurrence как Occ on OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
внутреннее соединение (выберите OccurrenceBucketID,
MIN (OccurrenceTime) как «MinOccurrenceTime»
от dbo.Occurrence
группа по OccurrenceBucketID) как minOcc по Occ.OccurrenceBucketID = minOcc.OccurrenceBucketID и
Occ.OccurrenceTime = minOcc.MinOccurrenceTime

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top