Russian Belarusian English German Japanese Ukrainian

Соединение таблиц

CuBook05

В набор данных можно включать поля из разных таблиц, подобное включение называется соединением (связыванием) таблиц. Соединение таблиц может быть внутренним и внешним. Внутреннее соединение представляет собой простейший случай, когда после слова SELECT перечисляются поля разных таблиц. Например:
SELECT P.Name, P.Position, P.Salary, A.Birthday, A.Note FROM Employее.db Р, Advanced.db A
Таблицы Employee и Advanced содержат основные и дополнительные сведения о сотрудниках организации. Таблицы связаны отношением «один-к-одному», т.е. каждой записи первой таблицы соответствует одна запись второй таблицы. Результирующий набор данных является объединением полей двух таблиц так, будто дополнительные данные соединены с основными. В таблицах могут быть выбраны не все поля, что не меняет принципа соединения. Результирующий набор будет иметь вид:
Name Position Salary Birthday Note
Иванов P.O. Директор 6700 29.10.51  
Петров А.П. Менеджер 5200 3.4.62  
Семенова И.И. Менеджер 5200 12.10.64  
Кузнецов П.А. Секретарь 3600 7.11.81 Исп. срок до 31.6.2002
Васин Н.Е. Водитель 2500 20.5.78  
Попов A.Л. Водитель 2400 3.2.75  
Использование внутреннего соединения применимо не всегда. Например, при использовании внутреннего соединения таблиц с отношением «один-ко-многим» результат выполнения запроса может содержать избыточную информацию.
 
Ниже приведен пример запрос, в котором внутреннее соединение таблиц приводит к избыточной информации в результирующей выборке:
SELECT S.S_Name, C.C_Date, C.C_Move, S.S_Price FROM Store.db S, Cards.db
С набор данных включает поля названия S_Name и цены C_Date товара из таблицы store склада, а также поля C_Date даты и количества C_Move товара из таблицы Cards движения товара. Число записей набора данных является произведением числа записей в таблицах склада и движения товара. Результирующий набор данных может иметь вид:
S_Name C_Date C_Move S_Price
Морковь 12.05.02 300 7,5
Морковь 13.05.02 200 7,5
Морковь 14.05.02 -7,5 7,5
Морковь 15.05.02 -30 7,5
Морковь 17.05.02 270 7,5
Морковь 18.05.02 200 7,5
Морковь 20.05.02 -120 7,5
Морковь 21.05.02 -10 7,5
Яблоки 12.05.02 300 25
Яблоки 12.05.02 200 25
Яблоки 13.05.02 -7,5 25
Помидоры 20.05.02 -10 40
Помидоры 21.05.02 250 40
Результирующая выборка содержит избыточную информацию и большое число записей, что не помогает, а, наоборот, мешает пользователю. Поэтому при внутреннем соединении таблиц, связанных соотношением «один-ко-многим», обычно применяются критерии отбора, ограничивающие состав записей. Ниже приведен такой запрос:
SELECT S.S_Name, C.C_Date, C.C_Move, S.S_Price FROM Store.db S, Cards.db С WHERE C.C_Code = S.S_Code
В отличие от предыдущего примера, число записей набора данных равно числу записей таблицы движения товара, т.к. отбираются записи, для которых совпадают значения полей кода. Результирующий набор данных будет таким:
S_Name C_Date C_Move S_Price
Морковь 12.05.02 300 7,5
Яблоки 12.05.02 200 25
Морковь 13.05.02 -7,5 7,5
Морковь 15.05.02 -30 7,5
Морковь 17.05.02 270 7,5
Морковь 18.05.02 200 7,5
Яблоки 17.05.02 200 25
Яблоки 18.05.02 -120 25
Морковь 20.05.02 -10 7,5
Помидоры 21.05.02 250 40
При внутреннем соединении все таблицы, поля которых указываются в SQL-запросе, являются равноправными.
 
При внешнем соединении таблиц можно указать, какая из таблиц будет главной, а какая подчиненной. При использовании внешнего соединения операнд FROM имеет следующий формат:
FROM <Таблица1> [<Вид соединения>] JOIN <Таблица2> ON <Условия отбора>
Критерий отбора после слова ON, как и ранее, задает условие включения записей в набор данных, связываемые таблицы указываются слева и справа от слова JOIN. Какая из двух таблиц будет главной, определяет вид соединения, который может иметь одно из следующих значений:
  • LEFT (главная таблица указана слева)
  • RIGHT (главная таблица указана справа) - по умолчанию
Ниже запрос, в котором используется внешнее связывание таблиц:
SELECT S.S_Name, C.C_Date, C.C_Move, S.S_Price FROM Store.db S LEFT JOIN Cards.db С ON С.C_Code = S.S_Code
Как и в предыдущем примере, связываются таблицы склада Store и движения товара Cards. Главной является таблица Store.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Защитный код Обновить