ORDERS_TBL
CUSTOMER_TBL
Вопросы связывания
Связывание по нескольким ключам
В большинстве случаев связывание таблиц осуществляется по одному ключевому полю одной таблицы и одному ключевому полю другой. Но в зависимости от структуры базы данных для вас может оказаться возможным связать таблицы и по нескольким ключам. В таблице может иметься ключ, составленный из значений не одного, а нескольких столбцов. Точно так же из нескольких столбцов может состоять и внешний ключ.
Рассмотрим следующие таблицы.
PROD:
SERIAL_NUMBER NOT NULL NUMBER(10)
VENDOR_NUMBER NOT NULL NUMBER(10)
PRODUCT_NAME NOT NULL VARCHAR2(10)
COST NOT NULL NUMBER (8, 2)
ORD:
ORD_NO NOT NULL NUMBER(10)
SERIAL_NUMBER NOT NULL NUMBER(10)
VENDOR_MUMBER NOT NULL NUMBER(10)
QUANTITY NOT NULL NUMBER(5)
ORD_DATE NOT NULL DATE
Ключом в таблице PROD является комбинация столбцов SERIAL_NUMBER и VENDOR_NUMBER Вероятно, в данной торговой компании некоторые товары имеют один серийный номер, но различаются по коду производителя.
Внешним ключом в таблице ORD тоже является комбинация столбцов
SERIAL_NUMBER И VENDOR_NUMBER.
При выборе данных из обеих таблиц (PROD и ORD) оператор связывания может выглядеть следующим образом:
|
|
SELECT Р.PRODUCT_NAME, O.ORD_DATE, О.QUANTITY
FROM PROD P, ORD О
WHERE P.SERIAL_NUMBER = O.SERIAL_NUMBER AND P.VENDOR_NUMBER = О.VENDOR_NUMBER;
Прежде чем использовать связывание, следует получить ответы на ряд важных вопросов. Например, какие из столбцов необходимо связать, имеются ли общие столбцы вообще, а также вопросы оптимизации. Вопросы оптимизации будут рассматриваться в ходе урока 18, «Управление доступом к базе данных».
Использование связующей таблицы
Как осуществить связывание? Если нужно связать таблицы, не имеющие общих столбцов, необходимо использовать третью таблицу, имеющую общие столбцы, как с первой, так и со второй таблицей. Такая таблица называется связующей таблицей.
Связующую таблицу можно использовать для связывания как таблиц с общими столбцами, так и таблиц, не имеющих общих столбцов.
Для примера использования связующей таблицы рассмотрим следующие три таблицы.
CUST_ID VARCHAR2(10) NOT NULL Ключевое поле
CUST_NAME VARCHAR2(30) NOT NULL
CUST_ADDRESS VARCHAR2(20) NOT NULL
CUST_CITY VARCHAR2(15) NOT NULL
CUST_STATE CHAR(2) NOT NULL
CUST_ZIP NUMBER(5) NOT NULL
CUST_PHONE NUMBER(10)
CUST_FAX NUMBER(10)
ORD_NUM VARCHAR2(10) NOT NULL Ключевое поле
CUST_ID VARCHAR2(10) NOT NULL
PROD_ID VARCHAR2(10) NOT NULL
QTY NUMBER(6) NOT NULL
ORD_DATE DATE
PROD_ID VARCHAR2(10) NOT NULL Ключевое поле
PROD_DESC VARCHAR2(40) NOT NULL
COST NUMBER (6,2) NOT NULL
Необходимо использовать таблицы CUSTOMER_TBL и PRODUCTS_TBL. У этих таблиц нет общих столбцов, по которым можно было бы выполнить связывание. Приходится использовать таблицу ORDERS_TBL, в которой имеется поле CUST_ID, присутствующее и в таблице CUSTOMER_TBL, и в таблице PRODUCTS_TBL. Условия связывания и результаты выглядят следующим образом.
SELECT C.CUST_NAME, P.PROD_DESC
FROM CUSTOMER_TBL С, PRODUCTS_TBL P, ORDERS_TBL О
WHERE C.CUST_ID = O.CUST_ID AND P.PROD_ID = O.PROD_ID;
CUST_NAME PROD_DESC
LESLIE GLEASON КОСТЮМ ВЕДЬМЫ
SCHYLERS NOVELTIES ПЛАСТИКОВЫЕ ТЫКВЫ
WENDY WOLF ПЛАСТИКОВЫЕ ТЫКВЫ
GAVINS PLACE ФОНАРИ
SCOTTYS MARKET ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ
ANDYS CANDIES ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ
Обратите внимание на назначение таблицам псевдонимов и их использование в выражении ключевого слова WHERE.