Присоединяется к оракулу - PullRequest
0 голосов
/ 06 июня 2019

Если я просто напишу этот запрос -

 SELECT * FROM AA,BB WHERE AA.ID = BB.ID 

, то какое это будет объединение.Если мы применяем какое-либо соединение, то нам нужно указать как внутреннее соединение, внешнее соединение, перекрестное соединение.Тогда что это за соединение?

И в чем же на самом деле разница между внутренним и перекрестным соединением?

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Вы спросили: Если я просто напишу этот запрос -

SELECT * FROM AA,BB WHERE AA.ID = BB.ID 

, то какое это будет объединение?

это ВНУТРЕННЕЕ СОЕДИНЕНИЕ, использующее предварительный синтаксис ANSI-92.

Если мы применим какое-либо соединение, то нам нужноуказать как внутреннее соединение, внешнее соединение, перекрестное соединение.

Только при использовании текущего синтаксиса соединения ANSI (который должен быть в 2019 году).

Тогда что же это за соединение?

Действительно, это перекрестное соединение, которое позволяет исключить записи на основегде пункт заставляет его вести себя как внутреннее соединение.Исключите условие where, и вы получите каждую запись в AA для каждой записи в BB.

И какова реальная разница между Inner Join и Cross join? >

  • Внутреннее объединение возвращает только записи, которые EXIST & RELATE В обеих задействованных таблицах
  • Перекрестное соединение связывает КАЖДУЮ запись в одной таблице с КАЖДОЙ записью в другой.
  • Возьмем, к примеру, две таблицы (A, B, C) (A, B, D)
  • , когда INNER JOIN вернет набор {AA, BB} (2)
  • перекрестное соединение вернет {AA, AB, AD, BA, BB, BD, CA, CB, CD} (9)
1 голос
/ 06 июня 2019

Ваш запрос представляет собой внутреннее соединение.Например, в образце схемы Скотта он объединит строки из таблиц EMP и DEPT в DEPTNO (это обычный столбец):

SQL> select count(*)
  2  from emp e inner join dept d on e.deptno = d.deptno;

  COUNT(*)
----------
        14

SQL>

(вы можете опустить innerключевое слово).


Вы спросили, в чем разница между внутренним и перекрестным соединением;Перекрестное соединение представляет собой декартово произведение, что означает, что результатом будут пары всех строк из первой таблицы со всеми строками из второй таблицы:

SQL> select count(*)
  2  from emp e cross join dept d;

  COUNT(*)
----------
        56

SQL>

Использование «your» old синтаксис, это объединение без WHERE предложение:

SQL> select count(*)
  2  from emp e, dept d;

  COUNT(*)
----------
        56

SQL>

Внешнее объединение будет принимать строки, у которых нет «пары» в другой таблице.В схеме Скотта это отдел 40 в таблице DEPT, так как там нет сотрудников, которые там работают:

SQL> select count(*)
  2  from emp e right outer join dept d on e.deptno = d.deptno;

  COUNT(*)
----------
        15

SQL>

Старый оператор внешнего соединения Oracle ((+)) - это то, что вы все еще можете где-то увидеть:

SQL> select count(*)
  2  from emp e, dept d
  3  where e.deptno (+) = d.deptno;

  COUNT(*)
----------
        15

SQL>

По сути, вам следует перейти на современные объединения.Подробнее о предмете в документации по объединениям здесь: https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries006.htm#SQLRF52331 (версия 11g; найдите ту, что относится к вашей версии базы данных, хотя в последних версиях не должно быть ничего революционного ).

0 голосов
/ 06 июня 2019

Похоже, вы не совсем понимаете различные типы соединений. Всего существует 5 различных типов соединения: ВНУТРЕННЕЕ, ВЛЕВОЕ НАРУЖНОЕ, ПРАВНОЕ НАРУЖНОЕ, ПОЛНОЕ НАРУЖНОЕ, КРЕСТ. Я покажу вам пример всех 5, используя эти 2 таблицы Таблицы AA и BB будут иметь только идентификатор поля. Таблица AA будет иметь «A» и «B» в качестве значений для ID. Таблица BB будет иметь значения «B», «C» и «D» для идентификатора.

Для INNER JOIN включены только те строки с совпадающими значениями. Таким образом, ВНУТРЕННЕЕ объединение AA и BB будет: 'B', 'B'

Для LEFT OUTER JOIN возвращается каждая строка в левой таблице, а для тех строк в правой таблице без совпадающего значения возвращается NULL. Итак, мы получаем: 'A', NULL 'B', 'B'

Для RIGHT OUTER JOIN возвращается каждая строка в правой таблице, а для тех строк в левой таблице без соответствующего значения возвращается NULL. Итак, мы получаем: 'B', 'B' NULL, 'C' NULL, 'D'

Для FULL OUTER JOIN возвращаются все строки в обеих таблицах. И пропущенные значения в любой таблице равны NULL. Итак, мы получаем: 'A', NULL 'B', 'B' NULL, 'C' NULL, 'D'

И, наконец, для CROSS JOIN каждая строка в каждой таблице возвращается с каждой строкой в ​​другой таблице. Итак, мы получаем: «А», «В» 'А', 'C', 'ОБЪЯВЛЕНИЕ' 'B', 'B' 'ДО НАШЕЙ ЭРЫ' 'B', 'D'

Для приведенного вами примера оператора SQL вы возвращаете INNER JOIN. Что касается разницы между INNER JOIN и CROSS JOIN, вышеприведенный пример должен был проиллюстрировать различия, но для INNER JOIN вы изучаете минимальное количество строк, а для CROSS JOIN вы изучаете максимально возможное число рядов. В общем, если вы исследуете план для запроса SQL и обнаруживаете, что в плане используется CROSS JOIN, чаще всего вы сталкиваетесь с ошибкой в ​​вашем SQL, поскольку перекрестные объединения имеют тенденцию быть чрезвычайно трудоемкими и интенсивно вводить / выводить .

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