我一直在試圖追查我遇到的查詢問題。查詢實際上是通過HQL從HQL生成的,但生成的SQL並沒有達到我所期望的。稍微修改SQL會產生正確的結果,但我不確定爲什麼修改應該有所作爲。交叉連接行爲(SQLServer 2008)
原始查詢(沒有返回)
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
相同。所以我不明白爲什麼查詢返回不同的結果。
是否與第一個查詢中導致此問題的交叉連接和外部連接之間的交互有關?我查看了查詢計劃,第二個查詢計劃看起來很合理。第一個沒有外連接,這很奇怪。
這是SQLServer的2008年
謝謝+1。在我的HQL中,我使用了COMMA,所以我不確定爲什麼Hibernate會渲染CROSS JOIN。我切換了from子句,所以Period表是最後一個,它正常工作。仍然產生了交叉連接,但是因爲它的優先級是最後的,所以它按預期工作。 – 2011-01-24 18:01:03