我正在使用 SQL Server 2008。
我有一個 SELECT 查詢,如下所示:
SELECT
Apples.ID, COUNT(Pips.Apples_ID)
FROM
Apples
LEFT JOIN
Table_B tb ON Apples.ID = tb.Apples_ID
LEFT JOIN
Table_C tc ON tb.xID = tc.xID
LEFT JOIN
Pips p ON tb.Apples_ID = p.Apples_ID
WHERE
tc.X IS NULL
GROUP BY
Apples.ID
這些表是:
Apples每個 Apple 都有一個唯一的條目 (ID)。Pips它可以有幾十個屬于 1 個蘋果的點數Table_B并且Table_C是映射表以細化搜索
我需要對結果進行分組,因為我不希望蘋果可以擁有的每個 Pip 都得到蘋果的結果。SELECT 陳述句起作用并回傳唯一 Apple ID 的串列
我現在想洗掉這些蘋果。我把我的陳述改為:
DELETE Apples
FROM Apples
LEFT JOIN Table_B tb ON Apples.ID = tb.Apples_ID
LEFT JOIN Table_C tc ON tb.xID = tc.xID
LEFT JOIN Pips p ON tb.Apples_ID = p.Apples_ID
WHERE tc.X IS NULL
GROUP BY Apples.ID
但在GROUP BY.
我試過:
DELETE x
FROM
(SELECT Apples.ID
FROM Apples
LEFT JOIN Table_B tb ON Apples.ID = tb.Apples_ID
LEFT JOIN Table_C tc ON tb.xID = tc.xID
LEFT JOIN Pips p ON tb.Apples_ID = p.Apples_ID
WHERE tc.X IS NULL
GROUP BY Apples.ID) x;
但我得到了一個錯誤:
視圖或函式不可更新,因為修改影響多個基表
如何在SELECT不使用臨時表或腳本的情況下洗掉我在 中確定的這些行?
uj5u.com熱心網友回復:
正如其他人指出的那樣,子查詢方法可以通過IN ( ... )在正常的單表洗掉上使用子句來適應作業。這是將任何選擇陳述句調整為洗掉的最簡單方法:
DELETE FROM Apples
WHERE ID IN (
-- Sub-query selecting a single column of ID values
)
然后,子查詢可以是復雜的,只要你喜歡,使用GROUP BY,HAVING等等,只要它只有在一列SELECT清單。
但是,在您的特定情況下,不需要:
- 您沒有
HAVING子句,因此COUNT()不會更改要洗掉的行 - 在
LEFT JOIN該Pips表上比其他的結果沒有任何影響COUNT() - 在 a
DELETE中兩次提及同一行沒有效果,因此不需要消除重復項
因此,您可以在不使用子查詢的情況下簡化這種特殊情況:
DELETE Apples
FROM Apples
LEFT JOIN Table_B tb ON Apples.ID = tb.Apples_ID
LEFT JOIN Table_C tc ON tb.xID = tc.xID
WHERE tc.X IS NULL
uj5u.com熱心網友回復:
DELETE FROM Apples WHERE ID in
(
SELECT a.ID FROM Apples a
LEFT JOIN Table_B tb ON a.ID = tb.a
LEFT JOIN Table_C tc ON tb.xID = tc.xID
LEFT JOIN Pips p ON tb.Apples_ID = p.a
WHERE tc.X IS NULL
GROUP BY a.ID
) as q
uj5u.com熱心網友回復:
您是否正在努力實作這一目標:
DELETE FROM APPLES WHERE ID IN
(
SELECT Apples.ID FROM Apples
LEFT JOIN Table_B tb ON Apples.ID = tb.Apples_ID
LEFT JOIN Table_C tc ON tb.xID = tc.xID
LEFT JOIN Pips p ON tb.Apples_ID = p.Apples_ID
WHERE tc.X IS NULL
GROUP BY Apples.ID
) x;
uj5u.com熱心網友回復:
在查詢中唯一起作用的是 tc.X 為空。如果沒有匹配項或有匹配項但欄位 X 為空,則它可以為空:
delete from Apples
where AppleId in
(
SELECT Apples.ID FROM Apples
LEFT JOIN Table_b tb ON tApples.ID = tb.Apples_ID
LEFT JOIN Table_C tc ON tb.xID = tc.xID
WHERE tc.X IS NULL
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358154.html
標籤:sql sql-server
上一篇:在僅表日期中插入40年的記錄
下一篇:Postgresql列參考不明確
