Ситуация
При выполнении следующих запросов получается одинаковое количество записей, хотелось бы узнать, в чем отличие использования a (+)
в конце запроса.
SELECT A.IDTABLAA,B.NOMBRETABLAB
FROM TABLA_A A, TABLA_B B
WHERE A.IDTABLAA=B.IDTABLAB
--Количество записей: 2265
SELECT A.IDTABLAA, B.NOMBRETABLAB
FROM TABLA_A A, TABLA_B B
WHERE A.IDTABLAA=B.IDTABLAB(+)
--Количество записей: 2265
Окружающая среда
- База данных: Oracle 11g
Оператор
(+)
указывает, что будет выполнено ВНЕШНЕЕ СОЕДИНЕНИЕ, в зависимости от позиции оператора. ВНЕШНЕЕ СОЕДИНЕНИЕ возвращает все строки, соответствующие указанному условию, плюс 0 или более строк из одной таблицы, которым нет совпадений в другой таблице.Для выполнения
LEFT OUTER JOIN
оператор должен появиться в таблице справа:В конкретном случае ваших таблиц выполняется a
LEFT OUTER JOIN
, поэтому результатом будут все строки, соответствующие условию,JOIN
а также строкиA.IDTABLAA
, не соответствующие условию.Для выполнения
RIGHT OUTER JOIN
оператор должен появиться в таблице слева:Также необходимо учитывать следующие ограничения:
(*)
внутри предложенияWHERE
JOIN
, оператор должен использоваться для всехJOIN
.WHERE
Если он присутствует в предложении(*)
, его нельзя комбинировать с другими условиями с операторамиAND
илиOR
.Это уникальный оператор для Oracle, поэтому, если вы хотите перенести этот код на какую-либо другую СУБД, рекомендуется использовать стандартный синтаксис
OUTER JOINS
.Это старый синтаксис Oracle
LEFT OUTER JOIN
до того, как он был стандартизирован .Эквивалентом с текущим синтаксисом будет:
Разница в том, что при наличии
LEFT OUTER JOIN
( или (+) справа от=
вWHERE
) все строки таблицы включаются в результатA
, даже если они не имеют соответствия в таблице , в этом случае в качестве значенияB
помещается a .NULL