Я пытался отследить проблему с помощью имеющегося у меня запроса. Запрос фактически генерируется спящим режимом из 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
Насколько я понимаю, это может быть неверным, так как запись из Таблица 1 a, таблица 2 b
аналогична записи из таблицы 1 перекрестного соединения Table2 b
. Поэтому я не понимаю, почему запросы возвращают разные результаты.
Это как-то связано с взаимодействием между перекрестным соединением и внешними соединениями в первом запросе, который вызывает это? Я просмотрел планы запросов, и второй план запроса выглядит разумным. У первого вообще нет внешних соединений, что странно.
Это на SQLServer 2008.