条件的放置是否重要?

fli*_*p99 6 sql postgresql

以下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)

我假设条件对两个查询执行相同的操作,仅在不同的时间.我错过了什么吗?

Jay*_*Jay 3

它们是并且应该是不同的。

考虑这样的情况:您有一个带有 ab 的 a 与商家和代理 ID 相匹配,并且 b.default 不为空。

在第一种情况下,你会找到a,然后找不到符合条件的b,因为没有b与id的匹配并且默认为null。但因为它是左连接,所以您仍然会在输出中获得包含“a”数据的记录。

在第二种情况下,你会找到a并找到匹配的b。但由于 b 未通过 WHERE 子句,因此该记录将从输出中排除。

如果您正在进行完全连接,将条件置于 ON 与 WHERE 中不会改变输出。但在左连接或右连接上,它确实会按照我上面尝试描述的方式改变输出。