將唯一行從 TableA 移動/複製到 TableB(如果它們不在 TableB 中)
我需要將每個唯一的行從 移動
TableA
到TableB
,如果唯一的行TableA
還沒有在TableB
。兩個表看起來都一樣,它們沒有任何
key
s,但是有一個組合的列使它們的行對我的任務來說是唯一的 -num
這是一個int
andcom
, avarbinary(512)
。由於我的 SQL 很糟糕,我想創建一個完成這項工作的腳本,但我有一些荒謬的問題,轉義/處理
varbinary
值。這就是我尋求幫助的原因。我可以虛擬碼..
移動/複製::
SELECT * INTO TableB WHERE (unique TableA.num + TableA.com) AND NOT IN (TableB) FROM TableA
之後,僅用於移動
DELETE FROM TableA WHERE (unique from above)
(使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2)
額外細節
對不起。我仍在學習 SQL並提出適當的問題..
TableA
&TableB
具有相同的設計。它們有多個列,包括上面提到的兩個。我需要移動和複製(取決於選擇的選項)。TableA
是源頭,TableB
是目的地。兩個表都可能包含多次出現的相同 int/com 組合。我只需要每種組合中的一種(不管是哪一種)。複製時,它們不會從中刪除TableA
,而在移動時,它們應該是。
如果我能正確理解您要做什麼,您希望其中的
SELECT
所有記錄TableA
只出現一次,但還沒有出現在TableB
.你可以用 a
GROUP BY
來HAVING
辨識那些只出現在 中的那些TableA
,然後用 aEXCEPT
過濾掉那些已經出現在 中的TableB
。SELECT int, com FROM TableA GROUP BY int, com HAVING COUNT(*) = 1 EXCEPT SELECT int, com FROM TableB
如果您實際上想要
SELECT
所有尚未出現在 中的不同記錄TableA
(無論它們在 中出現多少次) ,TableA``TableB
那麼你可以使用DISTINCT
關鍵字。**編輯:**正如@ypercube 正確指出的那樣,
EXCEPT
已經過濾了DISTINCT
行SELECT int, com FROM TableA EXCEPT SELECT int, com FROM TableB
如果這兩個表有更多的列,使用它來
NOT EXISTS
代替EXCEPT
. 您還可以使用ROW_NUMBER()
2005+ 版本中的任意行來選擇。因此,從表 A 複製到 B 將是:INSERT INTO TableB (int, com, --- rest of the columns) SELECT int, com, --- rest of the columns, FROM ( SELECT int, com, --- rest of the columns, rn = ROW_NUMBER() OVER (PARTITION BY int, com ORDER BY someColumn) FROM TableA AS a WHERE NOT EXISTS ( SELECT * FROM TableB AS b WHERE b.int = a.int AND b.com = a.com ) ) AS copy WHERE rn = 1 ;