Создание запросов в СУБД AccessРефераты >> Программирование и компьютеры >> Создание запросов в СУБД Access
Рис. 3.1. Иллюстрация декартова произведения
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливается соответствие между:
- кодами трапез (Т) в таблицах Меню и Трапезы (Меню.Т = Трапезы.Т),
- кодами видов блюд (В) в таблицах Меню и Вид_блюд (Меню.В = Вид_блюд.В),
- номерами блюд (БЛ) в таблицах Меню и Блюда (Меню.БЛ = Блюда.БЛ).
Такой скорректированный запрос SELECT Меню.*, Трапезы.*, Вид_блюд.*, Блюда.*FROM Меню, Трапезы, Вид_блюд, БлюдаWHERE Меню.Т = Трапезы.ТAND Меню.В = Вид_блюд.ВAND Меню.БЛ = Блюда.БЛ;
позволит получить эквисоединение таблиц Меню, Трапезы, Вид_блюд и Блюда:
Т |
В |
БЛ |
Т |
Трапеза |
В |
Вид |
БЛ |
Блюдо |
В |
Основа |
Выход |
Труд |
1 |
З |
3 |
1 |
Завтрак |
З |
Закуска |
3 |
Салат витаминный |
З |
Овощи |
200. |
4 |
1 |
З |
6 |
1 |
Завтрак |
З |
Закуска |
6 |
Мясо с гарниром |
З |
Мясо |
250. |
3 |
1 |
Г |
19 |
1 |
Завтрак |
Г |
Горячее |
19 |
Омлет с луком |
Г |
Яйца |
200. |
5 |
. . . | ||||||||||||
3 |
Г |
16 |
3 |
Ужин |
Г |
Горячее |
16 |
Драчена |
Г |
Яйца |
180. |
4 |
3 |
Н |
30 |
3 |
Ужин |
Н |
Напиток |
30 |
Компот |
Н |
Фрукты |
200. |
2 |
3 |
Н |
31 |
3 |
Ужин |
Н |
Напиток |
31 |
Молочный напиток |
Н |
Молоко |
200. |
2 |
3.2.3. Естественное соединение таблиц
Легко заметить, что в эквисоединение таблиц вошли дубликаты столбцов, по которым проводилось соединение (Т, В и БЛ). Для исключения этих дубликатов можно создать естественное соединение тех же таблиц: SELECT Т, В, БЛ, Трапеза, Вид, Блюдо, Основа, Выход, ТрудFROM Меню, Трапезы, Вид_блюд, БлюдаWHERE Меню.Т = Трапезы.ТAND Меню.В = Вид_блюд.ВAND Меню.БЛ = Блюда.БЛ;
Реализация естественного соединения таблиц имеет вид
Т |
В |
БЛ |
Трапеза |
Вид |
Блюдо |
Основа |
Выход |
Труд |
1 |
З |
3 |
Завтрак |
Закуска |
Салат витаминный |
Овощи |
200. |
4 |
1 |
З |
6 |
Завтрак |
Закуска |
Мясо с гарниром |
Мясо |
250. |
3 |
1 |
Г |
19 |
Завтрак |
Горячее |
Омлет с луком |
Яйца |
200. |
5 |
. | ||||||||
3 |
Г |
16 |
Ужин |
Горячее |
Драчена |
Яйца |
180. |
4 |
3 |
Н |
30 |
Ужин |
Напиток |
Компот |
Фрукты |
200. |
2 |
3 |
Н |
31 |
Ужин |
Напиток |
Молочный напиток |
Молоко |
200. |
2 |
3.2.4. Композиция таблиц
Для исключения всех столбцов, по которым проводится соединение таблиц, надо создать композицию SELECT Трапеза, Вид, Блюдо, Основа, Выход, ТрудFROM Меню, Трапезы, Вид_блюд, БлюдаWHERE Меню.Т = Трапезы.ТAND Меню.В = Вид_блюд.ВAND Меню.БЛ = Блюда.БЛ;
имеющую вид
Трапеза |
Блюдо |
Вид |
Основа |
Выход |
Труд |
Завтрак |
Салат витаминный |
Закуска |
Овощи |
200. |
4 |
Завтрак |
Мясо с гарниром |
Закуска |
Мясо |
250. |
3 |
Завтрак |
Омлет с луком |
Горячее |
Яйца |
200. |
5 |
. . . | |||||
Ужин |
Драчена |
Горячее |
Яйца |
180. |
4 |
Ужин |
Компот |
Напиток |
Фрукты |
200. |
2 |
Ужин |
Молочный напиток |
Напиток |
Молоко |
200. |
2 |
3.2.5. Тета-соединение таблиц
В базе данных ПАНСИОН трудно подобрать несложный пример, иллюстрирующий тета-соединение таблиц. Поэтому сконструируем такой надуманный запрос: SELECT Вид_блюд.*, Трапезы.*FROM Вид_блюд, ТрапезыWHERE Вид > Трапеза;
позволяющий выбрать из полученного в п.3.2.1 декартова произведения таблиц Вид_блюд и Трапезы лишь те строки, в которых значение трапезы "меньше" (по алфавиту) значения вида блюда:
В |
Вид |
Т |
Трапеза |
З |
Закуска |
1 |
Завтрак |
С |
Суп |
1 |
Завтрак |
С |
Суп |
2 |
Обед |
Н |
Напиток |
1 |
Завтрак |