sql. Операторы InnerJoin и Outer
В первой таблице будет хранится ID пользователя и его nick-name, а во второй - ID ресурса, имя ресурса и ID пользователя, который может этот ресурс администрировать.
create table t_users (
t_id number(11, 0),
t_nickvarchar(16),
primary key (t_id) )
create table t_resources (
t_id number(11, 0),
t_namevarchar(16),
t_userid number (11, 0),
primarykey (t_id) )
Содержимое таблиц пусть будет таким:
T_ID T_NICK
1 user1
3 user3
4 user4
T_ID T_NAME T_USERID
1 res1 3
2 res2 1
3 res3 2
5 res5 3
Конструкция join выглядит так:
... join_type join table_name on condition …
Где join_type - тип join-выражения, table_name - имя таблицы, которая присоединяется к результату, condition - условие объединения таблиц.
Кострукцияjoin располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ (foreignkey).
Innerjoinнеобходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример:
selectt_resources.t_name, t_users.t_nick
fromt_resources
inner join t_users on t_users.t_id = t_resources.t_userid
Результат будет таким:
T_NAME T_NICK
res2 user1
res1 user3
res5 user3
В случае с leftjoin из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. Пример:
selectt_resources.t_name, t_users.t_nick
fromt_resources
left join t_users on t_users.t_id = t_resources.t_userid
Результат выполнения запроса:
T_NAME T_NICK
res1 user3
res2 user1
res3 (null)
res5 user3
Результат показывает все ресурсы и их администраторов, вне зависимотсти от того есть они или нет.
Rightjoin отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице:
selectt_resources.t_name, t_users.t_nick
fromt_resources
right join t_users on t_users.t_id = t_resources.t_userid
А результат будет следующим:
T_NAME T_NICK
res2 user1
res1 user3
res5 user3
(null) user4
Результирующая таблица показывает ресурсы и их администраторов. Если адмнистратор не задействован, эта запись тоже будет отображена. Такое может случиться, например, если ресурс был удален.
Fullouterjoin (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и rightjoin.
selectt_resources.t_name, t_users.t_nick
fromt_resources
full join t_users on t_users.t_id = t_resources.t_userid
А результат будет таким:
T_NAME T_NICK
res1 user3
res2 user1
res3 (null)
res5 user3
(null) user4
Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском - cartesianproduct).
Вот пример запроса, который аналогичен crossjoin:
selectt_resources.t_name, t_users.t_nick
fromt_resources, t_users