在进行选择之前,请检查一行的存在(SQL Server)
-
30-09-2019 - |
题
我有一个我想修改的SQL声明。就目前而言,我正在运行一个简单的选择,但我想修改它,因此仅将目标表中不存在的记录(由我的标准确定)。
这是我的最初声明:
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())
我想更改内容,以便只有在选票不存在时才能填充分期。这是一种可以接受的方法,还是有更好的选择?
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)) )
解决方案
您的技术看起来不错,除了 选择...进入 语法用于创建全新的表格。相反,您需要使用以下代码将行添加到现有表:
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)
其他提示
SELECT INTO
创建一个新表,而不是将数据插入现有表中。因此,我将检查表是否存在,然后在运行现有SQL之前将表放置。将确保每次丢弃并重新创建分期台。
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())
如果要在现有表中添加行,则应使用 INSERT INTO
根据Joe Stefanelli的答案。
不隶属于 StackOverflow