我目前有一个SQL insert into语句,用于将项目从一个相同的表复制到另一个表。
源表有许多相同的记录或记录,可能有很小的变化。
示例...
源表和目标表的格式为:
ItemDATE // ItemTIME // SITENAME // SERIAL_NO // RPM // Power // Voltage1 // Voltage2 // etc
来源可能包含:
ItemDATE // ItemTIME // SITENAME // SERIAL_NO // RPM // Power // Voltage1 // Voltage2 // etc
2013-01-01 00:00:00.000 // 17:00:00.1 // Oxford College // 0014617 // 1500 // 250 // 250.8 // 249.2
2013-01-01 00:00:00.000 // 17:00:00.1 // Oxford College // 0014617 // 1499// 249 // 253.5 // 240.6
2013-01-01 00:00:00.000 // 17:00:00.1 // Oxford College // 0014617 // 1502// 251 // 239.8 // 269.8
我的插入声明是:
INSERT INTO ReportingSystem.dbo.HistoryLog(ItemDATE, ItemTIME, SITENAME, SERIAL_NO, RPM, Power, Voltage1, Voltage2)
SELECT ItemDATE, ItemTIME, SITENAME, SERIAL_SN, RPM, Power, Voltage1, Voltage2
FROM ReportingSystem.dbo.RTCU
EXCEPT
SELECT ItemDATE, ItemTIME, SITENAME, SERIAL_SN, RPM, Power, Voltage1, Voltage2
FROM ReportingSystem.dbo.HistoryLog
其中HistoryLog是目的地,RTCU是源。
我不关心RPM,Power,Voltage1和Voltage2字段中的不同值,但不应该有itemDATE,ItemTIME,SITENAME和SERIAL_NO相同的记录。
但是在使用Except声明时,我仍然会在考虑整个记录时重复。
我尝试过以下操作但没有成功:
INSERT INTO HistoryLog
(ItemDATE, ItemTIME, SITENAME, SERIAL_NO, RPM, Power, Voltage1, Voltage2)
SELECT ItemDATE, ItemTIME, SITENAME, SERIAL_NO, RPM, Power, Voltage1, Voltage2
FROM RTCU
WHERE not exists (select * from HistoryLog
WHERE HistoryLog.ItemDATE = rtcu.ItemDATE
and HistoryLog.ItemTIME = rtcu.ItemTIME
and HistoryLog.SITENAME = rtcu.SITENAME
and HistoryLog.SERIAL_NO= rtcu.SERIAL_NO
);
请帮忙......
答案 0 :(得分:3)
INSERT INTO dbo.HistoryLog
(
ItemDATE, ItemTIME,
SITENAME, SERIAL_NO,
RPM, Power, Voltage1, Voltage2
)
SELECT
ItemDATE, ItemTIME,
SITENAME, SERIAL_NO,
RPM, Power, Voltage1, Voltage2
FROM
(
SELECT
ItemDATE, ItemTIME,
SITENAME, SERIAL_NO,
RPM, Power, Voltage1, Voltage2,
rn = ROW_NUMBER() OVER
(
PARTITION BY ItemDATE, ItemTIME,
SITENAME, SERIAL_NO
ORDER BY RPM DESC
)
FROM dbo.RTCU
) AS RTCU
WHERE rn = 1
AND NOT EXISTS
(
SELECT 1 FROM dbo.HistoryLog
WHERE ItemDATE = rtcu.ItemDATE
AND ItemTIME = rtcu.ItemTIME
AND SITENAME = rtcu.SITENAME
AND SERIAL_NO = rtcu.SERIAL_NO
);
答案 1 :(得分:0)
您的上一个查询应该可以正常工作。 ItemDATE
或其他3个接受NULL
值吗?它们无法与=
进行比较,例如
(HistoryLog.ItemDATE = rtcu.ItemDATE or HistoryLog.ItemDATE is null and rtcu.ItemDATE is null)
整理是区分大小写的吗?如果是这样,具有不同情况的字符串将不会按预期进行比较。使用COLLATE
指定其他排序规则,例如:
HistoryLog.SITENAME = rtcu.SITENAME COLLATE Cyrillic_General_CI_AS