вторник, 2 июля 2013 г.

Полные внешние объединения


Рубрика: Базы Данных
 
И снова продолжаю рассказывать про объединения. Тема у меня здоровенная получилась, на несколько частей. Зато и для других (новичков) полезно, и сам вспомнил некоторые моменты. Так что еще несколько частей в июле по теме БД я опубликую.

Кстати, еще на днях решил себе xbox поискать в инете. После продолжительных поисков я все-таки нашел место, где можно купить xbox 360 прошитый, как раз то, что я искал (правда — в Москве, но ничего, скоро туда съезжу, куплю). Можете посмотреть сами, по ссылке несколько разных моделей представлены, есть из чего выбрать.

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

Объединение с помощью +: 

Так как + нельзя использовать с двух сторон равенства, значит надо сначала прописать вывод всех строк из первой таблицы, затем – вывод всех строк из второй, а потом объединить эти два множества и удалить оттуда дубликаты. Для объединения и удаления дубликатов есть оператор слияния UNION. Можно сделать так: 

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

В результате получится множество, имеющее все строки как из первой, так и из второй таблиц:


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





5 пять





3 три









3 - 4 - 4

Объединение с помощью full outer join: 

Здесь все намного проще. Пишется первая таблица, затем ключевые слов FULL OUTER JOIN (outer можно не писать), вторая таблица ON условие объединения. Запрос будет следующим: 

SELECT * FROM TABLE1 t1 FULL OUTER JOIN TABLE2 t2 ON t1.id1 = t2.id1 

А результат такой же. Для полного внешнего объединения я предпочитаю использовать последний способ, а для левого или правого соединения – оператор +, он (по моему мнению) проще.

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

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