我對下面的示例資料進行了查詢。我不確定為什么第一個版本的查詢在 SQL Server 中不起作用,但第二個查詢確實并且希望獲得專業知識。
該表包含多批記錄。
查詢功能是查找上一個批次中不存在于當前批次中的記錄,在這種情況下,coli1 值為 2 和 4 的記錄。
我從表執行左外連接到表副本的查詢不起作用。
但是,當我將表封裝為子查詢時,它可以作業。
CREATE TABLE #t1 (col1 int,
batch int, );
INSERT INTO #t1
VALUES (1, 1),
(2, 1),
(3, 1),
(4, 1),
(5, 1),
(1, 2),
(3, 2),
(5, 2);
--This query does not work
SELECT *
FROM #t1 a
LEFT OUTER JOIN #t1 b ON a.col1 = b.col1
WHERE (a.batch = 1
AND b.batch = 2)
AND (b.col1 IS NULL);
這不回傳任何結果:
col1 batch col1 batch
----------- ----------- ----------- -----------
此查詢按預期作業
SELECT *
FROM (SELECT * FROM #t1 WHERE batch = 1) a
LEFT OUTER JOIN (SELECT * FROM #t1 WHERE batch = 2) b ON a.col1 = b.col1
WHERE b.col1 IS NULL;
當它回傳此結果時:
col1 batch col1 batch
----------- ----------- ----------- -----------
2 1 NULL NULL
4 1 NULL NULL
uj5u.com熱心網友回復:
您的第一個查詢包含相互矛盾的條件 - 如果您在過濾之前查看結果,您會發現您沒有 NULL 值。
看來您正在嘗試查找批處理 = 1 的行,而這些行沒有批處理 = 2 的相應行,您可以使用不存在的自聯接來執行此操作
select * from #t1 t
where t.batch = 1
and not exists (select * from #t1 t2 where t2.col1 = t.col1 and t2.batch = 2);
uj5u.com熱心網友回復:
由于您使用的是外部聯接,因此您需要稍微移動條件:
SELECT *
FROM #t1 AS a
LEFT JOIN #t1 AS b ON a.col1 = b.col1 AND b.batch = 2
WHERE a.batch = 1 AND b.batch IS NULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447369.html
