Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие любому из соединений.
Меню | Трапезы | Вид_блюд | Блюда | |||||||||
Т | В | БЛ | Т | Трапеза | В | Вид | БЛ | Блюдо | В | Основа | Выход | Труд |
З | Завтрак | З | Закуска | Салат летний | З | Овощи | 200. | |||||
З | Завтрак | З | Закуска | Салат мясной | З | Мясо | 200. | |||||
З | Завтрак | З | Закуска | Салат витаминный | З | Овощи | 200. | 4 * | ||||
. | . | . | . | . | . | . | . | . | . | . | . | . |
З | Завтрак | З | Закуска | Суп молочный | С | Молоко | 500. | |||||
З | Завтрак | З | Закуска | Бастурма | Г | Мясо | 300. | |||||
. | . | . | . | . | . | . | . | . | . | . | . | . |
З | Завтрак | З | Закуска | Кофе черный | Н | Кофе | 100. | |||||
З | Завтрак | З | Закуска | Кофе на молоке | Н | Кофе | 200. | |||||
З | Завтрак | З | Закуска | Салат летний | З | Овощи | 200. | |||||
З | Завтрак | З | Закуска | Салат мясной | З | Мясо | 200. | |||||
З | Завтрак | З | Закуска | Салат витаминный | З | Овощи | 200. | |||||
З | Завтрак | З | Закуска | Салат рыбный | З | Рыба | 200. | |||||
З | Завтрак | З | Закуска | Паштет из рыбы | З | Рыба | 120. | |||||
З | Завтрак | З | Закуска | Мясо с гарниром | З | Мясо | 250. | 3 * | ||||
. | . | . | . | . | . | . | . | . | . | . | . | . |
Рис. 3.1. Иллюстрация декартова произведения
|
|
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливается соответствие между:
- кодами трапез (Т) в таблицах Меню и Трапезы (Меню.Т = Трапезы.Т),
- кодами видов блюд (В) в таблицах Меню и Вид_блюд (Меню.В = Вид_блюд.В),
- номерами блюд (БЛ) в таблицах Меню и Блюда (Меню.БЛ = Блюда.БЛ).
Такой скорректированный запрос
SELECT Меню.*, Трапезы.*, Вид_блюд.*, Блюда.* FROM Меню, Трапезы, Вид_блюд, Блюда WHERE Меню.Т = Трапезы.Т AND Меню.В = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ; |
позволит получить эквисоединение таблиц Меню, Трапезы, Вид_блюд и Блюда:
Т | В | БЛ | Т | Трапеза | В | Вид | БЛ | Блюдо | В | Основа | Выход | Труд |
З | Завтрак | З | Закуска | Салат витаминный | З | Овощи | 200. | |||||
З | Завтрак | З | Закуска | Мясо с гарниром | З | Мясо | 250. | |||||
Г | Завтрак | Г | Горячее | Омлет с луком | Г | Яйца | 200. | |||||
. | . | . | . | . | . | . | . | . | . | . | . | . |
Г | Ужин | Г | Горячее | Драчена | Г | Яйца | 180. | |||||
Н | Ужин | Н | Напиток | Компот | Н | Фрукты | 200. | |||||
Н | Ужин | Н | Напиток | Молочный напиток | Н | Молоко | 200. |
Естественное соединение таблиц.
Легко заметить, что в эквисоединение таблиц вошли дубликаты столбцов, по которым проводилось соединение (Т, В и БЛ). Для исключения этих дубликатов можно создать естественное соединение тех же таблиц:
|
|
SELECT Т, В, БЛ, Трапеза, Вид, Блюдо, Основа, Выход, Труд FROM Меню, Трапезы, Вид_блюд, Блюда WHERE Меню.Т = Трапезы.Т AND Меню.В = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ; |
Реализация естественного соединения таблиц имеет вид
Т | В | БЛ | Трапеза | Вид | Блюдо | Основа | Выход | Труд |
З | Завтрак | Закуска | Салат витаминный | Овощи | 200. | |||
З | Завтрак | Закуска | Мясо с гарниром | Мясо | 250. | |||
Г | Завтрак | Горячее | Омлет с луком | Яйца | 200. | |||
. | . | . | . | . | . | . | . | . |
Г | Ужин | Горячее | Драчена Яйца | 180. | ||||
Н | Ужин | Напиток | Компот | Фрукты | 200. | |||
Н | Ужин | Напиток | Молочный напиток | Молоко | 200. |