ИСПОЛЬЗОВАНИЕ INSERT... SELECT ДЛЯ ПОСТРОЕНИЯ ВНЕШНЕГО СОЕДИНЕНИЯ
Для каждого поставщика получить его номер, фамилию, состояние и город вместе с номерами всех поставляемых им деталей, Если данный поставщик не поставляет вообще никаких деталей, то выдать информацию для этого поставщика, оставляя в результате пробелы вместо номера детали.
CREATE TABLE ВНЕШ_СОЕДИНЕНИЕ
(НОМЕР_ПОСТАВЩИКА CHAR (5),
ФАМИЛИЯ CHAR (20),
СОСТОЯНИЕ SMALLINT,
ГОРОД CHAR (15)),
НОМЕР_ДЕТАЛИ CHAR (6);
INSERT
INTO ВНЕШ_СОЕДИНЕНИЕ
SELECT S.*, SP.HOMEP_ДЕТАЛИ
FROM S, SP
WHERE S. НОМЕР_ПОСТАВЩИКА=SP. НОМЕР_ПОСТАВЩИКА;
INSERT
INTO ВНЕШ_СОЕДИНЕНИЕ
SELECT S.*, 'bb'
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SP
WHERE SP. НОМЕР_ПОСТАВЩИКА=
S. НОМЕР_ПОСТАВЩИКА);
Теперь таблица BHEШ_СОЕДИНЕНИЕ выглядит так:
ВНЕШ_СОЕДИНЕНИЕ | НОМЕР_ ПОСТАВЩИКА | ФАМИЛИЯ | СОСТОЯНИЕ | ГОРОД | НОМЕР_ ДЕТАЛИ |
S1 S1 S1 S1 S1 S1 S2 S2 S3 S4 S4 S4 S5 | Смит Смит Смит Смит Смит Смит Джонс Джонс Блейк Кларк Кларк Кларк Адамc | Лондон Лондон Лондон Лондон Лондон Лондон Париж Париж Париж Лондон Лондон Лондон Атенс | Р1 Р2 РЗ Р4 Р5 Р6 Р1 Р2 Р2 Р2 Р4 Р5 bb |
Здесь 'bb' используется для представления строки пробелов. Пояснение. Первые двенадцать строк приведенного результата, как легко видеть, соответствуют первому из двух INSERT.. .SELECT и представляют собой обычное естественное соединение таблиц S и SP по номерам поставщиков, за исключением того, что не включен столбец КОЛИЧЕСТВО. Последняя строка результата соответствует второму INSERT.. .SELECT и сохраняет информацию для поставщика S5, который не поставляет никаких деталей. Полный результат представляет собой внешнее соединение таблиц S и SP по номерам поставщиков, в котором опущен столбец КОЛИЧЕСТВО. В противоположность этому обычное соединение называется иногда внутренним соединением.
Заметим, что нужны два отдельных INSERT.. .SELECT, поскольку подзапрос не может содержать UNION.