指定多个联接字段时,LEFT OUTER JOIN 会出现意外结果

问题描述 投票:0回答:1

table1 中的记录存在于 table2 中,但 LEFT OUTER JOIN 结果告诉我这些行不存在于 table2 中。

SELECT t1.keyField1, t2.keyField2
FROM table1 t1
LEFT OUTER JOIN table2 t2
ON t1.keyField1 = t2.keyField1 AND t1.year = 2023
WHERE t2.keyField1 IS NULL;

结果显示 t2.keyField2 为 NULL 值,其中大部分都是两个表中都存在的值。

t1.keyField1 t2.keyField2
12345
67890
45678
23456

我删除了附加连接条件

t1.year = 2023
,并将其移至 WHERE 子句:

SELECT t1.keyField1, t2.keyField2
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON t1.keyField1 = t2.keyField1
WHERE t2.keyField1 IS NULL AND t1.year = 2023;

我收到了预期的结果。

t1.keyField1 t2.keyField2
45678

为什么第一次连接会产生这样的结果?

为什么将附加连接条件移至 WHERE 子句会产生正确的结果?

sql sql-server left-join
1个回答
0
投票

因为您的匹配条件指定要选择 t2 记录,它必须具有与 t1 记录匹配的 keyfield1,并且该 t1 记录必须具有 2023 年。除 2023 年以外的任何 t1 记录都将始终返回.

您的第二个查询中似乎有一个拼写错误,应该是:

ON t2.keyField1 = t1.keyField1

(更正后的)第二个查询指定您要显示 2023 年以来没有匹配 t2 记录的所有 t1 记录

通常,您只想在 ON 子句中包含限制该表中选择的条件。

© www.soinside.com 2019 - 2024. All rights reserved.