常見需求:根據另一張表的條件,刪除本表中符合條件的列。這需要善用符合 SQL-92 標準的子查詢。雖然標準統一,但各資料庫廠商語法細節不同,部署前務必於測試環境驗證。
假設 breed 表存放品種資訊,inventory 表存放具體動物庫存。欲刪除所有「Shitzu」品種的庫存:
DELETE FROM inventory
WHERE breed_id IN (
SELECT breed_id FROM breed WHERE breed_name = 'Shitzu'
);
子查詢先取得目標 breed_id,外層 DELETE 再依此刪除。執行前建議先用 SELECT * 驗證將被刪除的列:
SELECT * FROM inventory
WHERE breed_id IN (
SELECT breed_id FROM breed WHERE breed_name = 'Shitzu'
);
雖然 SQL Server 文件宣稱支援 DELETE ... JOIN,但實測多平台均不支援,且不符 SQL-92 標準,不建議使用。
SQL-92 無標準語法支援單一 DELETE 針對多張表。DELETE 不接受多表參數,這也是為了避免破壞性操作的歧義。替代方案包括:
is_active 標記欄位,軟刪除取代硬刪除。DELETE 陳述式。SELECT 驗證影響範圍。