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 子句会产生正确的结果?
因为您的匹配条件指定要选择 t2 记录,它必须具有与 t1 记录匹配的 keyfield1,并且该 t1 记录必须具有 2023 年。除 2023 年以外的任何 t1 记录都将始终返回.
您的第二个查询中似乎有一个拼写错误,应该是:
ON t2.keyField1 = t1.keyField1
(更正后的)第二个查询指定您要显示 2023 年以来没有匹配 t2 记录的所有 t1 记录
通常,您只想在 ON 子句中包含限制该表中选择的条件。