不确定为什么 LEFT JOIN 没有返回数据
Unsure why LEFT JOIN is not returning data
我有一个查询,示例数据如下。我不确定为什么查询的第一个版本在 SQL 服务器中不起作用,但第二个查询可以并且希望获得专业知识。
table 包含多批记录。
查询功能是查找前一批中不存在于当前批中的记录,在本例中,coli1 的值为 2 & 4 的记录。
我从 table 到 table 的副本进行左外连接的查询不起作用。
然而,当我将 table 封装为子查询时,它起作用了。
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);
这个returns没有结果:
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;
作为 returns 这个结果:
col1 batch col1 batch
----------- ----------- ----------- -----------
2 1 NULL NULL
4 1 NULL NULL
您的第一个查询包含相互矛盾的条件 - 如果您在过滤前查看结果,您会发现没有 NULL 值。
您似乎在尝试查找 batch = 1 的行,而 batch = 2 没有相应的行,您可以使用 self-join 和 不存在
select * from #t1 t
where t.batch = 1
and not exists (select * from #t1 t2 where t2.col1 = t.col1 and t2.batch = 2);
由于您使用的是外部联接,因此需要稍微移动条件:
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
我有一个查询,示例数据如下。我不确定为什么查询的第一个版本在 SQL 服务器中不起作用,但第二个查询可以并且希望获得专业知识。
table 包含多批记录。
查询功能是查找前一批中不存在于当前批中的记录,在本例中,coli1 的值为 2 & 4 的记录。
我从 table 到 table 的副本进行左外连接的查询不起作用。
然而,当我将 table 封装为子查询时,它起作用了。
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);
这个returns没有结果:
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;
作为 returns 这个结果:
col1 batch col1 batch
----------- ----------- ----------- -----------
2 1 NULL NULL
4 1 NULL NULL
您的第一个查询包含相互矛盾的条件 - 如果您在过滤前查看结果,您会发现没有 NULL 值。
您似乎在尝试查找 batch = 1 的行,而 batch = 2 没有相应的行,您可以使用 self-join 和 不存在
select * from #t1 t
where t.batch = 1
and not exists (select * from #t1 t2 where t2.col1 = t.col1 and t2.batch = 2);
由于您使用的是外部联接,因此需要稍微移动条件:
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