我有一張包含數十萬個用戶 ID 和產品代碼的表格。我在 WHILE 回圈中使用 CTE 腳本根據層次結構洗掉產品 ID——即,如果用戶有產品 18 和 19,我洗掉 19。如果用戶有 17、18 和 19,我洗掉 18 和 19。問題是在生產表上作業的回圈成本太高且太耗時。
產品 ID 不是序號的——它們只是 ID。我的目標是根據下面代碼中顯示的層次結構洗掉產品 ID 行——例如,如果用戶 1 存在 17,則洗掉產品 18 和 19(如果其中一個或兩者都存在)。如果產品 18 和 19 存在(例如用戶 1),則僅洗掉 19 留下產品 18。
在以下示例中,需要保留組中的最小數字,但情況并非總是如此,因此我不能簡單地對產品型別進行分組并保留 MIN。
在下面的快速示例中,用戶 1 應保留 18,用戶 2 應保留 17。相反,僅保留用戶 2,并且為用戶 1 洗掉了兩個產品。我不知道我缺少什么。
CREATE TABLE #tmp (
ID varchar(1),
Prod varchar(2)
)
INSERT INTO #tmp
VALUES ('1', '18')
,('1', '19')
,('2', '17')
,('2', '18')
,('2', '19')
--SELECT * FROM #tmp ORDER BY ID
;WITH CTE (ID, Prod)
AS
(SELECT ID, Prod FROM #tmp)
DELETE FROM CTE
WHERE (Prod = 19
AND EXISTS (SELECT t.Prod
FROM #tmp t
INNER JOIN CTE ON t.ID = cte.ID
AND t.Prod = CTE.Prod
WHERE t.Prod = 18
))
OR (Prod = 18
AND EXISTS (SELECT t.Prod
FROM #tmp t
INNER JOIN CTE ON t.ID = cte.ID
AND t.Prod = CTE.Prod
WHERE t.Prod = 17
))
uj5u.com熱心網友回復:
您的“EXISTS”查詢幾乎可以歸結為“表中是否有任何 18”和“表中是否有任何 17”,這兩者都是正確的,因此所有 19 和 18 都將被洗掉。
我想你想要這個
;WITH CTE (ID, Prod) AS (SELECT ID, Prod FROM #tmp)
DELETE FROM CTE
WHERE (Prod = 19 AND EXISTS (SELECT * FROM #tmp t WHERE Prod = 18 AND t.ID = CTE.ID))
OR (Prod = 18 AND EXISTS (SELECT * FROM #tmp t WHERE Prod = 17 AND t.ID = CTE.ID))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477853.html
