Existenz einer Reihe zu prüfen, bevor ein SELECT INTO (SQL Server) zu tun
-
30-09-2019 - |
Frage
ich eine SQL-Anweisung haben Ich mag würde zu ändern. Wie es steht nun eine einfache SELECT INTO Ich laufe aber ich möchte es so modifizieren, nur Datensätze, die in der Zieltabelle nicht existieren (wie durch meine Kriterien bestimmt) angehängt werden.
Hier ist meine erste Aussage:
SELECT b.BallotID, m.MeetingDate
INTO StagingTable
FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())
würde ich gerne Dinge so ändern, dass die StagingTable nur bevölkert wird, wenn die Abstimmung nicht bereits vorhanden ist. Ist dies ein akzeptabler Weg, um darüber zu gehen, oder gibt es bessere Alternativen?
SELECT b.BallotID, m.MeetingDate
INTO StagingTable
FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())
AND NOT EXISTS(SELECT 1 from StagingTable where BallotID = b.BallotID)) )
Lösung
Ihre Technik sieht gut aus, außer dass die SELECT ... INTO Syntax wird verwendet, um eine brandneue Tabelle zu erstellen. Stattdessen würden Sie wollen, um den Code verwenden, unter Reihen zu einer vorhandenen Tabelle hinzuzufügen:
INSERT INTO StagingTable
(BallotID, MeetingDate)
SELECT b.BallotID, m.MeetingDate
FROM Ballot b
INNER JOIN Meeting m
on b.MeetingID = m.MeetingID
WHERE b.LastModifiedDate < '01-01-2010'
AND (b.BallotType = 'Agenda Vote' AND m.MeetingDate < GETDATE())
AND NOT EXISTS(SELECT 1 from StagingTable where BallotID = b.BallotID)
Andere Tipps
SELECT INTO
erstellt eine neue Tabelle, anstatt Einfügen von Daten in einer vorhandenen Tabelle. Aus diesem Grunde würde ich prüfen, ob die Tabelle vorhanden ist, wenn er dann die Tabelle nicht löschen, bevor Sie Ihre vorhandene SQL ausgeführt wird. Das stellt sicher, dass die StagingTable fallen gelassen wird und jedes Mal neu erstellt werden.
IF OBJECT_ID('StagingTable','U') IS NOT NULL
BEGIN
DROP TABLE StagingTable
END
SELECT b.BallotID, m.MeetingDate
INTO StagingTable
FROM Ballot INNER JOIN Meeting on b.MeetingID = m.MeetingID
WHERE b.LastModifiedDate < '01-01-2010' AND ( b.BallotType = 'Agenda Vote'
AND m.MeetingDate < GETDATE())
Wenn Sie Zeilen in die bestehenden Tabelle hinzufügen möchten, dann sollten Sie INSERT INTO
per Joe Stefanelli Antwort verwenden.