Шаг 28 - Снова SELECT - Объединения таблиц

Итак, отношение предок/потомок это в сущности отношение "один ко многим", но строить условия поиска только по этому принципу вовсе не обязательно. Вот, например, такой запрос по датам:

-- // ---------------------------------------------------------------------
Найти все заказы, полученные в тот день, когда на работу был принят новый
служащий.

SELECT ORDER_NUM, AMOUNT, ORDER_DATE, NAME
	FROM ORDERS, SALESREPS
WHERE ORDER_DATE = HIRE_DATE
/

Получаем 6 строк:

SQL> SELECT ORDER_NUM, AMOUNT, ORDER_DATE, NAME
  2  	FROM ORDERS, SALESREPS
  3  WHERE ORDER_DATE = HIRE_DATE
  4  /

   ORDER_NUM     AMOUNT ORDER_DATE  NAME
------------ ---------- ----------- ------------------------------
      112968      3,978 12.10.1989  Маша Распутина
      112979         15 12.10.1989  Маша Распутина
      112975        2,1 12.10.1989  Маша Распутина
      112968      3,978 12.10.1989  Максим Галкин
      112979         15 12.10.1989  Максим Галкин
      112975        2,1 12.10.1989  Максим Галкин

6 rows selected

Это пары строк из таблиц ORDERS и SALESREPS имеющие одинаковое значение в столбцах ORDER_DATE и HIRE_DATE.

Такая связь рождает отношение "многие ко многим". Что здесь собственно происходит, да просто в те дни, когда Маша Распутина и Максим Галкин были приняты на работу, было сделано три заказа соответственно, каждое, совпадение дат и дает три строки! Можно было сделать и на оборот, какие служащие были приняты в те дни когда были сделаны заказы... и так далее! Это в общем отвлеченные понятия, но оператор SELECT сработал безукоризненно. Итак, давайте сделаем небольшой итог:

  1. В объединении предок/потомок работает связь "один ко многим".
  2. В других объединениях, так же может существовать отношение "один ко многим", если по крайней мере в одной таблице связанный столбец содержит уникальные значения во всех строках.
  3. В объединениях, созданных на произвольном, связывании столбцов, существует отношение "многие ко многим".

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

SELECT NAME, QUOTA, CITY, TARGET
	FROM SALESREPS, OFFICES
WHERE QUOTA > TARGET
/

Соответственно получаем:

SQL> SELECT NAME, QUOTA, CITY, TARGET
  2  	FROM SALESREPS, OFFICES
  3  WHERE QUOTA > TARGET
  4  /

NAME                                QUOTA CITY                               TARGET
------------------------------ ---------- ------------------------------ ----------
Вася Пупкин                           350 Запиндрищинск                         300
Филип Киркоров                        350 Запиндрищинск                         300
Крис Кельми                           400 Запиндрищинск                         300
Игорь Петров                          350 Запиндрищинск                         300
Максим Галкин                         400 Запиндрищинск                         300
Крис Кельми                           400 Бубурино                              350
Максим Галкин                         400 Бубурино                              350

7 rows selected

Условие поиска QUOTA > TARGET отбирает пары, в которых значение столбца QUOTA из таблицы SALESREPS, превышает значение столбца TARGET из таблицы OFFICES. Обратите внимание на то, что выбранные столбцы связаны только таким образом! Данный пример является несколько надуманным, но все же показывает как различные условия поиска легко применимы в приложениях, например, для систем принятия решений, а так же исследующих более сложные взаимосвязи в БД. К стати, особенно когда дается запрос к 5ти и более таблицам начинаешь понимать, что нифига не понимаешь! :) Можете попробовать сами!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 14.09.2003