CREATE TABLE Временная ( Вид CHAR (8), Блюдо CHAR (60), Рецепт CHAR (560)); INSERT INTO Временная SELECT Вид, Блюдо, Рецепт FROM Блюда, Рецепты, Вид_блюд WHERE Блюда.БЛ = Рецепты.БЛ AND Блюда.В = Вид_блюд.В;в ней не окажется строки с Шашлыком (в таблице Рецепты не обнаружен код 34, и строка с этим кодом исключена из результата).
Следовательно, в некотором смысле можно считать, что при обычном соединении теряется информация для таких несоответствующих строк. Однако иногда (как и в приведенном примере) может потребоваться способность сохранить эту информацию. В этом случае можно воспользоваться так называемым внешним соединением:
INSERT INTO Временная SELECT Вид, Блюдо, Рецепт FROM Блюда, Рецепты, Вид_блюд WHERE Блюда.БЛ = Рецепты.БЛ AND Блюда.В = Вид_блюд.В; INSERT INTO Временная SELECT Вид, Блюдо, ??? FROM Блюда, Вид_блюд WHERE Блюда.В = Вид_блюд.В AND БЛ NOT IN ( SELECT БЛ FROM Рецепты);В результате будет создана базовая таблица
Вид | Блюдо | Рецепт |
---|---|---|
Закуска | Салат летний | Помидоры и яблоки нарезать... |
Закуска | Салат мясной | Вареное охлажденное мясо, ... |
. . . | ||
Напиток | Кофе черный | Кофеварку или кастрюлю спо... |
Напиток | Кофе на молоке | Сварить черный кофе, как ... |
Горячее | Шашлык | ??? |
Заметим, что для внешнего соединения нужны два отдельных INSERT...SELECT. Однако тот же результат можно получить и одним INSERT...SELECT, используя фразу UNION, объединяющую предложения SELECT из двух INSERT:
INSERT INTO Временная SELECT Вид, Блюдо, Рецепт FROM Блюда, Рецепты, Вид_блюд WHERE Блюда.БЛ = Рецепты.БЛ AND Блюда.В = Вид_блюд.В UNION SELECT Вид, Блюдо, ??? FROM Блюда, Вид_блюд WHERE Блюда.В = Вид_блюд.В AND БЛ NOT IN ( SELECT БЛ FROM Рецепты);