Sql-Server

將唯一行從 TableA 移動/複製到 TableB(如果它們不在 TableB 中)

  • December 3, 2018

我需要將每個唯一的行從 移動TableATableB,如果唯一的行TableA還沒有在TableB

兩個表看起來都一樣,它們沒有任何keys,但是有一個組合的列使它們的行對我的任務來說是唯一的 -num這是一個intand com, a varbinary(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.

你可以用 aGROUP BYHAVING辨識那些只出現在 中的那些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 ; 

引用自:https://dba.stackexchange.com/questions/83562