Почему разные результаты SQL? - PullRequest
1 голос
/ 15 мая 2009

Почему следующие запросы возвращают разные наборы результатов?

select count(ml.link_type),mc.conv_string
from MSP_CONVERSIONS mc,MSP_LINKS ml
where ml.PROJ_ID = 4
and mc.STRING_TYPE_ID = 3
and mc.CONV_VALUE *= ml.link_type
group by mc.conv_string

select count(ml.link_type),mc.conv_string
from MSP_CONVERSIONS mc left outer join MSP_LINKS ml on mc.CONV_VALUE = ml.LINK_TYPE
where ml.PROJ_ID = 4
and mc.STRING_TYPE_ID = 3
group by mc.conv_string

Первый запрос возвращает:

3 FF

10790 FS

0 SF

117 СС

Второй запрос возвращает:

3 FF

10790 FS

117 СС

Оба запроса выполняются для базы данных SQL Server 2008 Standard. Я не могу понять, почему возвращаются два разных набора результатов? Я думал, что * = это сокращенный синтаксис для LEFT OUTER JOIN. Я так долго смотрю на это, может быть, я что-то упустил?

Спасибо ...

Ответы [ 2 ]

4 голосов
/ 15 мая 2009

Потому что ваш первый запрос действительно эквивалентен этому:

select count(ml.link_type),mc.conv_string
from MSP_CONVERSIONS mc
LEFT JOIN MSP_LINKS ml
    ON ml.PROJ_ID = 4
    and mc.STRING_TYPE_ID = 3
    and mc.CONV_VALUE = ml.link_type
group by mc.conv_string

Вы включили все условия в объединение, что сделало невозможным полностью отфильтровать строки из таблицы MSP_CONVERSIONS. Лучше всего всегда придерживаться полного синтаксиса 'LEFT / INNER JOIN' и избегать путаницы.

2 голосов
/ 15 мая 2009

"* =" не столько "сокращенный" синтаксис, сколько старомодный синтаксис pre-ANSI OUTER JOIN. Не используйте это. Кроме того, в общем случае, если в вашем выделении «LEFT OUTER JOIN b ...», то добавление дополнительных критериев для «b» в предложении WHERE - плохая идея, если оно читается как фильтрация для применения к результату соединения, то он отбрасывает все строки, в которых не было совпадений в b, - эффективно преобразовывая ваше внешнее соединение во внутреннее соединение.

Это связано с тем, что написал Джоэл - наличие всех условий в предложении «ON» означает, что фильтрация применяется во время объединения, и это другой результат. Синтаксис ANSI является более явным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...