我使用 SQL Server 2014 資料庫和 SQL Server Management Studio 來創建和運行查詢。
表是:
人
| ID | personName |
---- ------------
| 1 | Hamish |
| 2 | Morag |
| 3 | Ewan |
汽車
| ID | CarName |
---- ---------
| 1 | Humber |
| 2 | Austen |
| 3 | Morris |
小工具
| ID | GadgetName |
---- ------------
| 1 | Cassette |
| 2 | CD |
| 3 | Radio |
車到人地圖
| ID | CarID | PersonID |
---- ------- ----------
| 1 | 1 | 1 |
CarToGadgetMap
| ID | CarID | GadgetID |
---- ------- ----------
| 1 | 2 | 2 |
映射表具有適當的外鍵。
我想洗掉Car存在但未使用的記錄。所以在上面的例子中,我想Car用ID = 3.
我有一個SELECT使用 3 JOINs的陳述句,如下所示。該宣告的作品,并回傳正確的行(S),即Car用ID = 3。
SELECT *
FROM
(SELECT Cars.*
FROM Cars
LEFT JOIN CarToGadgetMap ON Cars.ID = CarToGadgetMap.CarID
WHERE CarToGadgetMap.CarID IS NULL) t1
JOIN
(SELECT Cars.*
FROM Cars
LEFT JOIN PersonToCarMap ON Cars.ID = PersonToCarMap.CarID
WHERE PersonToCarMap.CarID IS NULL) t2 ON t1.ID = t2.ID
當我嘗試DELETE使用下面的代碼時,它會洗掉所有 3Car行:
DELETE Cars
FROM
(SELECT Cars.*
FROM Cars
LEFT JOIN CarToGadgetMap ON Cars.ID = CarToGadgetMap.CarID
WHERE CarToGadgetMap.CarID IS NULL) t1
JOIN
(SELECT Cars.*
FROM Cars
LEFT JOIN PersonToCarMap ON Cars.ID = PersonToCarMap.CarID
WHERE PersonToCarMap.CarID IS NULL) t2 ON t1.ID = t2.ID
結果資訊:
(3 row(s) affected)
檢查顯示表中的所有 3 行Cars都已洗掉。
為什么當SELECT陳述句只回傳 1 行時,所有記錄都會被洗掉?
請問有人可以幫忙嗎?
提前致謝
uj5u.com熱心網友回復:
您只需使用此代碼即可完成。我通過在最后創建資料庫和資料來測驗它。
DELETE Cars
FROM Cars
LEFT JOIN CarToPersonMap ON Cars.ID = CarToPersonMap.CarID
LEFT JOIN CarToGadgetMap ON Cars.ID = CarToGadgetMap.CarID
WHERE CarToPersonMap.CarID IS NULL and CarToGadgetMap.CarID IS NULL
uj5u.com熱心網友回復:
也許使用 WHERE 子句而不是 FROM。
DELETE cars WHERE cars.id = 3(讓您的查詢僅從您的邏輯中選擇 id,而不是選擇所有帶有汽車的表。*)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329761.html
標籤:sql sql-server 加入 sql-删除
上一篇:根據訂單狀態更新列
