Обновление одного запроса SQL
-
05-07-2019 - |
Вопрос
Мне нужно вставить значения в новый столбец в нашей базе данных, но я не могу заставить себя делать это последовательно.Данных очень много, поэтому о том, чтобы делать что-либо вручную, в значительной степени не может быть и речи.Позвольте мне подготовить почву:
У нас есть таблица с именем 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