2009-02-27 151 views

回答

8

嘛,在某些時候你將必須檢查所有的列 - 還不如讓加盟...

DELETE a 
FROM a -- first table 
INNER JOIN b -- second table 
     ON b.ID = a.ID 
     AND b.Name = a.Name 
     AND b.Foo = a.Foo 
     AND b.Bar = a.Bar 

應該這樣做......還有CHECKSUM(*),但這隻有有助於 - 您仍然需要檢查實際值以排除散列衝突。

+5

這隻要沒有任何列包含空值很好地工作。一旦發生這種情況,您必須開始處理複雜的條件,例如(a.Name = b.Name OR(a.Name IS NULL AND b.Name IS NULL))。另一個避免null的原因。 – 2009-03-02 00:39:12

1

我覺得下面的僞代碼會做吧..

DELETE FirstTable, SecondTable 
FROM FirstTable 
FULL OUTER JOIN SecondTable 
ON FirstTable.Field1 = SecondTable.Field1 
... continue for all fields 
WHERE FirstTable.Field1 IS NOT NULL 
AND SecondTable.Field1 IS NOT NULL 

克里斯的INTERSECT後是更爲優雅,雖然,我會使用,在未來,而不是寫出來的所有外部的連接標準:)

0

我會嘗試一個DISTINCT查詢並做兩個表的聯合。

您可以使用像asp/php這樣的腳本語言將輸出格式化爲一系列插入語句,以便重建生成的唯一數據表。

8

如果您使用SQL Server 2005中,你可以使用intersect

delete * from table1 intersect select * from table2 
0

試試這個:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id 
相關問題