воскресенье, 30 июня 2013 г.

Внешние объединения

Рубрика: Базы Данных

И снова продолжаю длинный рассказ про объединения, который я начал пару дней назад здесь. Вчера немного проленился, так что не опубликовал статью эту, поэтому сегодня будет еще одна статья опубликована, про хабр. Надо же уложиться в план, который я себе в начале года установил (про двадцать пять опубликованных статьей за месяц).

Внешние объединения нужно использовать в тех случаях, когда необходимо получить все строки из первой таблицы и существующие значения из второй (либо null, если значения для данного условия не существует). Внешне объединения (outer joins) используют реже, чем внутренние объединения.

Если вернуться к примеру с двумя таблицами table1 и table2 (из прошлой статьи), то, чтобы получить внешнее объединение, нужно получить все строки из первой таблицы (так как их там больше) и присоединить к ним значения из второй (или null). Для этого всего-лишь нужно выполнить следующий запрос:

SELECT *
FROM TABLE1 t1, table2 t2
WHERE t1.id1 = t2.id1(+)

Внимательный читатель заметит разницу между этим и прошлым запросами. Во where добавился оператор внешнего объединения (+). Он ставится около того поля, которое не обязательно. Так как id1 из второй таблицы нам не нужны, то около него и поставлен этот знак. Получится следующий результат:


ID1 VAL ID2 VAL2 ID1
1 один 1 - 1 - 1
2 два 2 - 2 - 2
7 семь





5 пять





3 три






Оператор + можно ставить как в правой, так и в левой части условия (если в правой части – то это левое соединение, если в левой части стоит +, то будет правое соединение). Если поменять местами этот оператор в запросе выше (WHERE t1.id1(+) = t2.id1), получится следующий результат:


ID1 VAL ID2 VAL2 ID1
1 один 1 - 1 - 1
2 два 2 - 2 - 2




3 - 4 - 4

Ограничения на внешние объединения:

Но не все так просто. При использовании внешних объединений существует несколько ограничений, о которых нужно помнить. Вот они:

1. Оператор + можно ставить только в одной части условия объединения, иначе появится ошибка ORA-01468.
2. Если вы объединяете более двух таблиц, то каждую из них можно внешне объединять только с одной другой таблицей. Если попробовать это сделать появится ошибка ORA-01417. Чтобы избежать ее нужно создать представления первого объединения и затем соединить его с другой таблице.
3. В условии с оператором + нельзя использовать IN, OR и подзапросы.

Оператор + это встроенный оператор в Oracle. Он не стандартизированный, зато очень простой. Есть еще стандартные (для sql) операторы объединения, но они сложнее, о них я рассказывать не буду. Только в следующей статье (полные внешние объединения) покажу как его можно использовать для упрощения создания полных внешних объединений.

Кстати, базы данных должны на чем-то крутиться — должен быть достойный сервер, который потянет БД (и другую ИТ-инфраструктуру) любого объема. Для этого идеально подойдет сервер hp ml 350, я нашел его на сайте компании SK Server Technologies. По ссылке можете почитать его характеристики, для меня они подходят. 

Комментариев нет:

Отправить комментарий