Поведение перекрестного соединения (SQLServer 2008)

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

7
задан Joe Stefanelli 24 January 2011 в 21:37
поделиться