我一直在尝试找出我的查询的问题。该查询实际上是由 hibernate 从 HQL 生成的,但生成的 SQL 并没有达到我的预期。稍微修改 SQL 会产生正确的结果,但我不确定为什么修改会产生任何差异。
原始查询(不返回任何行)
select sched.id, max(txn.dttm), acc.id
from PaymentSchedulePeriod sched
cross join PaymentSchedulePayment pay
right outer join AccountTransaction txn on pay.accountTransactionFk=txn.id
right outer join Account acc on txn.accountFk=acc.id
where sched.accountFk=acc.id
group by sched.id, acc.id
修改查询 - 交叉连接替换为逗号(隐式交叉连接)
返回一行
select sched.id, max(txn.dttm), acc.id
from PaymentSchedulePeriod sched
,PaymentSchedulePayment pay
right outer join AccountTransaction txn on pay.accountTransactionFk=txn.id
right outer join Account acc on txn.accountFk=acc.id
where sched.accountFk=acc.id
group by sched.id, acc.id
我的理解可能是不正确的,那就是写作from Table1 a, Table2 b
和写作一样from Table 1 a cross join Table2 b
。所以我不明白为什么查询返回不同的结果。
是否与导致此问题的第一个查询中的交叉联接和外联接之间的交互有关?我查看了查询计划,第二个查询计划看起来很合理。第一个根本没有外连接,这很奇怪。
这是在 SQL Server 2008 上。
JOIN 的优先级高于 COMMA,因此您的第二个语句被解释为(注意我添加的括号):
select sched.id, max(txn.dttm), acc.id
from PaymentSchedulePeriod sched
,(PaymentSchedulePayment pay
right outer join AccountTransaction txn on pay.accountTransactionFk=txn.id
right outer join Account acc on txn.accountFk=acc.id)
where sched.accountFk=acc.id
group by sched.id, acc.id
也可以看看:根据 SQL-99 的 JOIN 优先规则 http://opensource.atlassian.com/projects/hibernate/browse/HHH-1480
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)