將行複製到表中同時避免重複
目標是將所有行從一個表(srcTable) 傳輸到另一個表( destTable) ,排除任何重複的條目。雖然添加帶有過濾掉重複項的子查詢的 WHERE 子句似乎很簡單,但這種方法可能會失敗。
子查詢問題:
原始查詢如下:
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
但是,此查詢不會插入任何行,因為子查詢傳回destTable中的所有行,無論是否它們符合srcTable 中的任何行。要使子查詢正常運作,它必須包含一個附加條件來根據相關欄位識別重複行。
修訂後的子查詢:
INSERT INTO destTable SELECT Field1, Field2, Field3, ... FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable WHERE (srcTable.Field1 = DestTable.Field1 AND srcTable.Field2 = DestTable.Field2 ... etc.))
此修訂後的子查詢比較特定的子查詢用於確定重複項並將其從插入中排除的字段。
外部聯結替代方法:
另一種方法是使用外部連接:
INSERT INTO destTable SELECT s.field1, s.field2, s.field3,... FROM srcTable s LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...) WHERE d.Key1 IS NULL
此外連接技術從srcTable 中過濾掉在destTable中具有匹配鍵的行,並在插入期間排除重複項.
尋址源表重複項:
如果擔心sourceTable 包含重複行,則應修改查詢以選擇不同的行:
INSERT INTO destTable SELECT DISTINCT Field1, Field2, Field3,... FROM srcTable
建議在INSERT 語句中包含特定欄位名稱優於使用SELECT *.
以上是如何將行從一個表複製到另一個表,同時防止重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!