SQL Single Query Update
-
05-07-2019 - |
Frage
Ich muss Werte in eine neue Spalte in unserer Datenbank einfügen, aber ich kann es nicht auf konsistente Weise machen. Es gibt viele Daten, daher ist es so ziemlich in Frage, dass alles manuell ist. Lassen Sie mich die Bühne einstellen:
Wir haben eine Tabelle, die als Vorkommen und eine Tabelle bezeichnet wird, die als Auftreten von Buckets bezeichnet wird, in dem jedes Vorkommen auf den Eimer referenziert, dem sie zugewiesen wurden. Früher war dies eine Einweg-Referenz, aber aus verschiedenen Gründen haben wir beschlossen, eine Referenz vom Vorkommen zum ersten Ereignis zurückzuführen (zuerst in der Zeit). Die Tische sehen jetzt so aus:
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
Ich suche nach einer Möglichkeit, das erste Ereignis zu einem Eimer zu bestimmen und das FirstOccurceId, FirstOccurrencetime und FirstOccurrencemessage mit Werten aus diesem ersten Ereignis für alle meine Auftreten zuzuweisen.
Machen Sie einen von Ihnen SQL-FU-Experten da draußen Zeit, mir zu helfen, alle meine Versuche, eine falsche oder unvollständige Auswahl von Vorkommen zu erzeugen.
Lösung
Sie können dies versuchen
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
BEARBEITEN:
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
Andere Tipps
Nun, um das erste Ereignis in einem Eimer zu finden, sollte nicht die folgenden Arbeiten funktionieren?
SELECT TOP 1
OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
OccurranceBucketID = @OccurranceBucketID
ORDER BY
OccurranceTime ASC
Sie können die zurückgegebenen Felder Variablen zuweisen und dann Ihren Auftritt entsprechend aktualisieren.
NB: "Vorkommen" hat kein "A" darin.
Diese Antwort beruht darauf, dass das Ereignis für jedes Ereignis einzigartig ist: -
Update Occbuck Set
Occbuck.firstoccurceId = occ.occurceId,
OCCBUCK.FIRSTOCCURENCETIME = OCC.Occurrencetime,
Occbuck.firstoccurrencemessage = occ.occurrencemessage
aus
dbo.occurrenceBucket als Occbuck
innerer Join dbo.occurce als OCC bei OCCBUCK.OccurrenceBucketID = OCC.OccurceBucketID
innerer Join (Wählen Sie Ereignis aus
Min (Vorkehrung) als "minokcurrencetime"
Aus DBO.Occurce
Gruppe durch AuftretenBucketid) als minokc bei occcurceBucketid = minocc.OccurceBucketid und
Occ.occurrencetime = minocc.minoccurrencetime