Я пытался отследить проблему с помощью моего запроса.Запрос фактически генерируется 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.