不确定为什么 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