以下2个查询给出了不同的结果:
SELECT A.source_code, B.quantity
FROM Table_A AS A
LEFT JOIN Table_B AS B ON B.merchant_id = A.merchant_id
AND B.agent_id = A.agent_id
AND B.default IS NULL
WHERE A.month='2011-10-01'
AND B.type='600'
Run Code Online (Sandbox Code Playgroud)
和
SELECT A.source_code, B.quantity
FROM Table_A AS A
LEFT JOIN Table_B AS B ON B.merchant_id = A.merchant_id
AND B.agent_id = A.agent_id
WHERE A.month='2011-10-01'
AND B.type='600'
AND B.default IS NULL
Run Code Online (Sandbox Code Playgroud)
我假设条件对两个查询执行相同的操作,仅在不同的时间.我错过了什么吗?
它们是并且应该是不同的。
考虑这样的情况:您有一个带有 ab 的 a 与商家和代理 ID 相匹配,并且 b.default 不为空。
在第一种情况下,你会找到a,然后找不到符合条件的b,因为没有b与id的匹配并且默认为null。但因为它是左连接,所以您仍然会在输出中获得包含“a”数据的记录。
在第二种情况下,你会找到a并找到匹配的b。但由于 b 未通过 WHERE 子句,因此该记录将从输出中排除。
如果您正在进行完全连接,将条件置于 ON 与 WHERE 中不会改变输出。但在左连接或右连接上,它确实会按照我上面尝试描述的方式改变输出。