gpt4 book ai didi

sql - 交叉联接行为 (SQLServer 2008)

转载 作者:行者123 更新时间:2023-12-02 16:08:09 25 4
gpt4 key购买 nike

我一直在尝试找出我的查询存在的问题。该查询实际上是由 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 相同。所以我不明白为什么查询返回不同的结果。

导致此问题的第一个查询中的交叉联接和外联接之间的交互是否与此有关?我查看了查询计划,第二个查询计划看起来很合理。第一个根本没有外连接,这很奇怪。

这是在 SQLServer 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

另请参阅:JOIN precendence rules per SQL-99

关于sql - 交叉联接行为 (SQLServer 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com