我执行了这些查询
SELECT *
FROM A
INNER JOIN B ON coalesce(A.a1,'') = coalesce(B.a1,'') and A.a1 <> '';
/\
||
Condition in On Clause
和
SELECT *
FROM A
INNER JOIN B ON coalesce(A.a1,'') = coalesce(B.a1,'') WHERE A.a1 <> '';
/\
||
Condition in Where Clause
并得到不同的结果?
我想了解将过滤条件置于开启条款与 条款中的条件
之间的区别是什么哪一个在性能方面更好?
更新
示例数据
两个表中的 a1
为空''
。
Now with 1st Query i am getting no Rows --> 0 Rows
but with my 2nd Queries i am getting multiple Rows --> 1251 Rows
答案 0 :(得分:0)
他们不一样。
考虑以下问题:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345
和
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID AND Orders.ID=12345
第一个将返回订单及其行(如果有),订单号为12345.第二个将返回所有订单,但只有订单12345将包含与之关联的任何行。
使用INNER JOIN,子句有效等效。然而,仅仅因为它们在功能上是相同的,因为它们产生相同的结果,并不意味着这两种从句具有相同的语义。
我的意思是:
- 内连接无关紧要
- 外连接的数据
一个。 &#39;其中&#39;条款:加入后。加入后的记录将被过滤。
湾&#39;上&#39;条款 - 加入之前。记录(来自右表)将在加入之前进行过滤,结果可能最终为null(因为OUTER join)。
请参阅这些文章: http://weblogs.sqlteam.com/jeffs/archive/2007/05/14/criteria-on-outer-joined-tables.aspx
和
https://sites.google.com/site/nosuchmethodexception/database/join/join-vs-where-clause
答案 1 :(得分:0)
在您的第一个查询中,条件&#34;和A.a1&lt;&gt;&#39;&#39; &#34;仅应用于表B.但是,第二个查询中的where条件将应用于A和B.
它对内部连接没有任何影响,但它影响了左连接