Да, существуют различия в семантике стандартного внешнего соединения и внешнего соединения в стиле Informix, что неизбежно означает, что существуют различия в плане запроса.
В общем, используйте стандартную нотацию для любогоновый или измененный код - оставьте нотацию внешнего соединения в стиле Informix для (неизмененного) унаследованного кода и, предпочтительно, обновите даже эту ноту, чтобы использовать новые нотации соединения.
В чем разница?Справедливый вопрос - трудно объяснить, и еще сложнее придумать хороший (правдоподобный пример).По сути, запись в стиле Informix сохраняет строки из «доминантных» таблиц (внешних таблиц), даже если существуют критерии, основанные на значениях во внешней объединенной таблице, которые отклоняют эти строки.
Эти два запроса дают один и тот же результат:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column;
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column;
Эти два запроса не обязательно приводят к одному и тому же результату:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column
AND (o.alt_column IS NULL OR o.alt_column = 1);
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column
WHERE (o.alt_column IS NULL OR o.alt_column = 1);
Разница возникает в такой ситуации:
DominantTable OuterJoinedTable
pk_column other_column fk_column alt_column
1 twenty 1 3
Стандартная запись LEFT OUTER JOIN создаст пустой набор в качестве результата.Соединение в стиле Informix даст результат:
pk_column other_column fk_column alt_column
1 twenty null null
Данные из DominantTable не были отклонены из-за условия фильтрации в доминирующей таблице, поэтому они сохраняются Informix.Стандартное объединение выполняет внешнее объединение, а затем фильтрует результат.