Шаг 27 - Снова SELECT - Таблиц становится больше!

Итак, одну и две таблицы мы опрашивали, а что, если их будет больше? Да, в общем-то можно и больше, хотя я в своей практике более трех таблиц в запросе объединяю редко! :) Нет пока особой нужды, но знать как это делается не помешает. Итак, как обычно записываем наши формулировки запросов и смотрим и разбираем, что же там происходит! :)

Вывести список заказов стоимостью выше $700, включая имя служащего, принявшего заказ и имя клиента сделавшего его.

SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
	FROM ORDERS, CUSTOMERS, SALESREPS
WHERE CUST = CUST_NUM AND
	  REP = EMPL_NUM AND
	  AMOUNT > 700
/

Получаем следующее:

SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
  2  	FROM ORDERS, CUSTOMERS, SALESREPS
  3  WHERE CUST = CUST_NUM AND
  4  	  REP = EMPL_NUM AND
  5  	  AMOUNT > 700
  6  /
  

    ORDER_NUM     AMOUNT COMPANY                        NAME
------------- ---------- ------------------------------ --------------
       112983        702 Крупное предприятие            Вася Пупкин
       112922        760 Просто Балбесы                 Игорь Петров
       113049        710 Просто Балбесы                 Игорь Петров

3 rows selected

А, теперь посмотрим на рисунок:

27_1.gif (13452 b)

Из рисунка видно, что запрос построен по равенству столбцов и использует в запросе три(!) таблицы. Как видно, столбец CUST таблицы ORDERS является внешним ключом для таблицы CUSTOMERS, а столбец REP той же таблицы ORDERS является внешним ключом для таблицы SALESREPS! Иначе говоря, запрос связывает каждый заказ с соответствующим клиентом и служащим. Вот так и получился, запрос к трем таблицам.

Давайте для более полного, понимания, выполним еще вот такой запрос: Вывести список заказов стоимостью выше $700, включая имя клиента разместившего заказ и имя служащего закрепленного за этим клиентом.

SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
	FROM ORDERS, CUSTOMERS, SALESREPS
WHERE CUST = CUST_NUM AND
	  CUST_REP = EMPL_NUM AND
	  AMOUNT > 700
/

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

SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME
  2  	FROM ORDERS, CUSTOMERS, SALESREPS
  3  WHERE CUST = CUST_NUM AND
  4  	  CUST_REP = EMPL_NUM AND
  5  	  AMOUNT > 700
  6  /

    ORDER_NUM     AMOUNT COMPANY                        NAME
------------- ---------- ------------------------------ --------------
       112983        702 Крупное предприятие            Вася Пупкин
       112922        760 Просто Балбесы                 Игорь Петров
       113049        710 Просто Балбесы                 Игорь Петров

3 rows selected

Как-то странно, но предыдущий запрос дал тот же результат! Да и бог с ним, здесь поменялись роли столбцов. Теперь столбец CUST работает как внешний ключ для таблицы CUSTOMERS, а столбец CUST_REP срабатывает внешним ключом для таблицы SALESREPS. Теперь логика запроса несколько поменялась. Данный запрос связывает каждый заказ с клиентом, а каждого клиента с закрепленным за ним служащим. Надеюсь, что не слишком запутал вас и разобраться как все это работает в общем-то не сложно! :)

Так же в промышленных масштабах иногда выполняют запросы к трем и более таблицам, вот где нужно иметь полное представление о связях в таблицах БД! И мы с вами можем проделать нечто подобное на нашей учебной БД.

Давайте попробуем, дать вот такой запрос: Вывести список заказов стоимостью выше $700, включая имя клиента, разместившего заказ и имя служащего, закрепленного за этим клиентом, а так же офис, в котором работает этот служащий.

SELECT ORDER_NUM, AMOUNT, COMPANY, NAME, CITY
	FROM ORDERS, CUSTOMERS, SALESREPS, OFFICES
WHERE CUST = CUST_NUM AND
	  CUST_REP = EMPL_NUM AND
	  REP_OFFICE = OFFICE AND
	  AMOUNT > 700
/

Четыре(!) таблицы! Получаем:

SQL> SELECT ORDER_NUM, AMOUNT, COMPANY, NAME, CITY
  2  	FROM ORDERS, CUSTOMERS, SALESREPS, OFFICES
  3  WHERE CUST = CUST_NUM AND
  4  	  CUST_REP = EMPL_NUM AND
  5  	  REP_OFFICE = OFFICE AND
  6  	  AMOUNT > 700
  7  /

 ORDER_NUM     AMOUNT COMPANY                        NAME                           CITY
---------- ---------- ------------------------------ ------------------------------ ------------------------------
    112983        702 Крупное предприятие            Вася Пупкин                    Бубурино
    112922        760 Просто Балбесы                 Игорь Петров                   Котрогайка
    113049        710 Просто Балбесы                 Игорь Петров                   Котрогайка

3 rows selected

Здесь так же используется связь предок/потомок. Теперь мы связали заказ с клиентом клиента - с закрепленным за ним служащим, а служащего с его офисом! Вот так связывается хоть сотня таблиц, главное не получить мозговую травму! :) Пробуйте!


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