loading..
Русский    English
06:39
листать

Эквисоединения стр. 1

Соединения, которые мы рассмотрели ранее и которые преобладают в примерах данного учебника, называются соединениями по предикату.

Синтаксис этого вида соединения такой:

  1. Таблица_1 <тип соединения> JOIN  Таблица_2 ON <предикат>

где

 тип соединения := [INNER] | [OUTER]{LEFT | RIGHT | FULL}

Эти соединения являются наиболее общими, т.к. в качестве предиката может быть использовано любое логическое выражение. Именно по этой причине все диалекты поддерживают этот вид соединения.

Частным, но часто используемым соединением является эквисоединение - случай, когда предикат представляет собой равенство значений в столбцах соединяемых таблиц.

При этом соединяемые столбцы зачастую имеют одинаковые имена, поскольку в соединении участвуют таблицы, связанные внешним ключом. Впрочем, последнее не суть важно, т.к. мы можем переименовать столбцы, если это нам потребуется.

Так вот для этого частного случая соединения - эквисоединения по столбцам с одинаковыми именами - имеются отдельные синтаксические формы соединения: естественное соединение и соединение, использующее имена столбцов.

Естественное соединение

  1. Таблица_1 NATURAL <тип соединения> JOIN  Таблица_2

Предикат здесь не нужен, т.к. он подразумевается, а именно попарное равенство всех столбцов с одинаковыми именами в обеих таблицах. Например, если у обеих соединяемых  таблиц есть столбцы a и b, то естественное соединение

  1. Таблица_1 NATURAL INNER JOIN  Таблица_2
будет эквивалентно такому соединению по предикату:

  1. Таблица_1 INNER JOIN  Таблица_2 ON Таблица_1.a = Таблица_2.a AND Таблица_1.b = Таблица_2.b

    Кроме того, при естественном соединении одноименные столбцы будут присутствовать в выборке в одном экземпляре. Сравните, например, результаты таких запросов (база данных Аэрофлот)

Консоль
Выполнить
  1. SELECT * FROM Pass_in_trip
  2.     JOIN Passenger ON Pass_in_trip.id_psg = Passenger.id_psg
  3. WHERE trip_no=1123;

trip_no   date    id_psg    place    id_psg    name
1123    2003-04-05 00:00:00    3    2a    3    Kevin Costner
1123    2003-04-08 00:00:00    1    4c    1    Bruce Willis
1123    2003-04-08 00:00:00    6    4b    6    Ray Liotta
и

  1. SELECT * FROM Pass_in_trip
  2.     NATURAL JOIN Passenger
  3. WHERE trip_no=1123;

id_psg    trip_no    date    place    name
6    1123    2003-04-08 00:00:00    4b    Ray Liotta
3    1123    2003-04-05 00:00:00    2a    Kevin Costner
1    1123    2003-04-08 00:00:00    4c    Bruce Willis

Как видно из представленных результатов, столбец id_psg, по которому выполняется соединение, не повторяется для естественного соединения.

Из СУБД, доступных на сайте sql-ex.ru, только SQL Server не поддерживает естественное соединение. Если вы хотите поработать с естественным соединением практически, выберите в консоли PostgreSQL или MySQL.

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.