0

現在、ある同一のテーブルから別のテーブルに項目をコピーする SQL 挿入ステートメントがあります。

ソース テーブルには、多数の同一のレコード、またはわずかに異なる可能性があるレコードがあります。

例...

ソース テーブルと宛先テーブルの形式は次のとおりです。

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
);

助けてください....

4

2 に答える 2

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
);
于 2013-02-02T16:18:11.243 に答える
0

最後のクエリは正常に機能するはずです。または他の 3 は値ItemDATEを受け入れますか? 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
于 2013-02-02T15:52:09.823 に答える