Различие между Oracle плюс (+) нотация и ansi ПРИСОЕДИНЯЕТСЯ к нотации?

Python не имеет тех же типов как C/C++, который, кажется, Ваш вопрос.

Попытка это:

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123456789L
>>> type(i)
<type 'long'>
>>> type(i) is long
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

различие между интервалом и долго уходит в Python 3.0, все же.

71
задан PeeHaa 24 November 2013 в 01:45
поделиться

3 ответа

AFAIK, нотация (+) присутствует только для обратной совместимости, потому что Oracle представила ее до того, как был введен стандарт ANSI для объединений. Он специфичен для Oracle, и вам следует избегать его использования в новом коде, когда доступна эквивалентная версия, соответствующая стандартам.

Похоже, между ними есть различия, а нотация (+) имеет ограничения, которые синтаксис соединения ANSI не имеет. Сами Oracle рекомендуют не использовать нотацию (+) . Полное описание здесь, в Справочнике по языку Oracle® Database SQL. 11g Release 1 (11.1) :

Oracle рекомендует использовать синтаксис предложения FROM OUTER JOIN вместо оператора соединения Oracle. Запросы внешнего соединения, использующие оператор соединения Oracle (+) , подчиняются следующим правилам и ограничениям, которые не применяются к синтаксису предложения FROM OUTER JOIN :

  • Вы не можете указать оператор (+) в блоке запроса, который также содержит синтаксис соединения предложения FROM .
  • Оператор (+) может появляться только в предложении WHERE или в контексте левой корреляции (при указании предложения TABLE ) в предложении FROM и может применяться только в столбец таблицы или представления.
  • Если A и B соединены несколькими условиями соединения, вы должны использовать оператор (+) во всех этих условиях. Если вы этого не сделаете, Oracle Database вернет только строки, полученные в результате простого соединения, но без предупреждения или ошибки, чтобы сообщить вам, что у вас нет результатов внешнего соединения.
  • (+) Оператор не создает внешнее соединение, если вы указываете одну таблицу во внешнем запросе, а другую таблицу во внутреннем запросе.
  • Вы не можете использовать оператор (+) для внешнего соединения таблицу к себе, хотя самостоятельные соединения допустимы.

Например, следующий оператор недопустим:

 SELECT employee_id, manager_id
ОТ сотрудников
ГДЕ employee.manager_id (+) = employee.employee_id;

Однако следующее самосоединение допустимо:

 SELECT e1.employee_id, e1.manager_id, e2.employee_id
ОТ сотрудников e1, сотрудников e2
ГДЕ e1.manager_id (+) = e2.employee_id;
  • Оператор (+) может применяться только к столбцу, а не к произвольному выражению. Однако произвольное выражение может содержать один или несколько столбцов, помеченных оператором (+) .
  • Условие WHERE , содержащее оператор (+) , не может можно комбинировать с другим условием с помощью логического оператора OR .
  • В условии WHERE нельзя использовать условие сравнения IN для сравнения столбца, помеченного ] (+) оператор с выражением.

Если предложение WHERE содержит условие, которое сравнивает столбец из таблицы B с константой, тогда к столбцу должен быть применен оператор (+) , чтобы Oracle возвращал строки из таблицы A, для которых он сгенерировал пустые значения для этого столбца. В противном случае Oracle возвращает только результаты простого соединения.

В запросе, который выполняет внешние соединения более чем двух пар таблиц, одна таблица может быть таблицей, сгенерированной нулевым значением, только для одной другой таблицы. По этой причине вы не можете применить оператор (+) к столбцам B в условии соединения для A и B и условии соединения для B и C. См. SELECT для синтаксис для внешнего соединения.

97
ответ дан 24 November 2019 в 13:01
поделиться

Я согласен с ответом Тони Миллера и хотел бы добавить, что есть также несколько вещей, которые вы НЕ можете делать с (+) синтаксисом:

  • Вы не можете ПОЛНОСТЬЮ ВНЕШНИЙ СОЕДИНЕНИЕ два таблицы, вы должны сделать это вручную с помощью UNION ALL двух объединений,
  • Вы не можете ВНЕШНЕЕ СОЕДИНЕНИЕ таблицы с двумя или более таблицами, вам необходимо вручную создать подзапрос (например: b.id = a .id (+) И c.id = a.id (+) не является допустимым предложением)
12
ответ дан 24 November 2019 в 13:01
поделиться

Нотация все еще поддерживается в Oracle 10 (и, как мне кажется, 11). Его использование считается «старомодным», а также не так переносимо, как синтаксис ANSI JOIN. Он также считается гораздо менее читаемым, хотя, если вы пришли из фона +, привыкание к ANSI JOIN может занять некоторое время. Перед тем как бросать кирпичи в Oracle, важно знать, что они разработали свой синтаксис + до того, как комитет ANSI завершил определения для объединений.

Нет никакой разницы в производительности; они выражают то же самое.

Редактировать: Под «не такой переносимый» я должен был сказать «поддерживается только в Oracle SQL»

12
ответ дан 24 November 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: