Программирование >>  Исключение дубликатов строк 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 152


Рецепт

Крахмал

Бульон

Мясо

Овощи

Тушеная баранина

Картофель

Вода

Баранина

Горошек

Тушеная курица

Куриный бульон

Курица

Морковь

Вегетарианские тушеные овощи

Наста

Вода

То фу

Молодой горошек в стручках

Тушеное мясо по-ирландски

Картофель

Бульон

из говядины

Говядина

Капуста

Тушеная свинина

Наста

Вода

Свинина

Набор результатов второго запроса может иметь следующий вид (это рецепты из поваренной книги Майкла):

Рецепт

Крахмал

Бульон

Мясо

Овощи

Тушеная баранина

Картофель

Вода

Баранина

Горошек

Тушеная индейка

Куриный бульон

Индейка

Морковь

Вегетарианские тушеные овощи

Наста

Овощной отвар

То фу

Молодой горошек в стручках

Тушеное мясо по-ирландски

Картофель

Бульон

из говядины

Говядина

Капуста

Тушеная свинина

Бобы

Вода

Свинина

Разность между рецептами Джона и Майкла представляет собой рецепты из поваренной книги Джона, которые отсутствуют в поваренной книге Майкла:

Рецепт

Крахмал

Бульон

Мясо

Овощи

Тушеная курица

Куриный бульон

Курица

Морковь

Вегетарианские тушеные овощи

11аста

Вода

Тофу

Молодой горошек в стручках

Тушеная свинина

11аста

Вода

Свинина

Можно посмотреть на задачу с другой стороны. Предположим, нужно найти рецепты из поваренной книги Майкла, которых нет в поваренной книге Джона. Вот ответ:

Рецепт

Крахмал

Бульон

Мясо

Овощи

Тушеная индейка

Куриный бульон

Индейка

Морковь

Вегетарианские тушеные овощи

Наста

Овошдой отвар

Тофу

Молодой горошек в стручках

Тушеная свинина

Бобы

Вода

Свинина




Снова воспользуемся графическим представлением множеств, чтобы наглядно показать, как работает операция разности. Предположим, что имеется БД, содержащая все ваши любимые рецепты. Вам очень не нравится вкус лука с говядиной, поэтому нужно найти все рецепты с говядиной, но без лука. На рис. 7.3 представлена диаграмма множеств, которая помогает наглядно пред-

Рис. 7.3.

Рецепты с говядиной, по без лука

ставить решение этой задачи.

Верхний круг представляет собой множество рецептов, в которых используется говядина. Нижний круг представляет множество рецептов, которые содержат лук. Там, где два круга перекрываются, находятся рецепты, включающие оба компонента. Затемненная часть верхнего круга, которая не является частью перекрывающейся области, представляет множество рецептов, содержащих говядину, но не содержащих лук. Подобным образом часть нижнего круга, которая не является частью перекрывающейся области, представляет собой множество рецептов, содержащих лук, но без говядины.

Вначале в SQL запрашивается извлечение всех рецептов, содержащих говядину. Затем извлекаются все рецепты, содержащие лук. Специальное ключевое слово SQL - EXCEPT - связывают два запроса для получения окончательного ответа.

Не попали ли вы снова в ловушку? Если таблица рецептов выглядит подобно нашим примерам, то вы, вероятно, думаете, что можно просто запросить:

Show те the recipes that have beef as the meat ingredient and that do not have onions as the vegetable ingredient. ( Показать рецепты, которые в качестве мясного компонента содержат говядину и не содержат в качестве овощного компонента лук .)

Преобразование: Select the recipe name from the recipes table where meat

ingredient is beef and vegetable ingredient is not onions (Выбрать наименование рецепта из таблицы Рецепты , где мясным компонентом является говядина, а овощным компонентом не является лук)

Уточнение: Select the recipe name from the recipes table where meat

ingredients ts = beef and vegetable ingredient is not <> onions

(Выбрать наименование рецепта из Рецепты ,

где мясной компонент и овощной компонент

говядина лук)



SQL SELECT RecipeName

FROM Recipes

WHERE Meatlngredient = Beef

AND Vegetablelngredient о Onions

Здесь снова встает вопрос относительно рецептов, которые содержат другие компоненты, а не мясо и овощи. Ведь некоторые рецепты содержат множество компонентов, а другие - лишь несколько. Правильно спроектированная база данных рецептов включает отдельную таблицу Recipe Ingredients (Компоненты рецептов) с одной строкой для каждого компонента в каждом рецепте. Каждая строка компонента будет содержать только один компонент, поэтому не может быть строки с говядиной и луком одновременно. Вначале потребуется найти все строки с говяди-

Рецепты, содержащие говядину, но без лука или моркови


Рис. 7,4.

Рецепты с говядиной, но без лука или моркови

НОИ, затем все строки с луком и, наконец, найти их разность на RecipelD.

А как насчет немного более сложных проблем? Пусть, скажем, вам захотелось добавить в нашу смесь еще и морковь. Диаграмма для множества, показывающая решение, представлена на рис. 7.4.

Вначале нужно найти множество рецептов, содержащих говядину, затем получить разность либо с множеством рецептов, содержащих лук, либо с множеством, содержащим морковь. Возьмите

этот результат и получите разность с оставшимся множеством (луком или морковью), чтобы оставить только те рецепты, которые содержат говядину, но не содержат морковь или лук (область штриховки светлого тона на верхнем круге).

Зодочи, которые можно решить, используп розность

В отличие от пересечения (при котором осуществляется поиск общих элементов двух множеств) разность ищет элементы, которые имеются в одном множестве, но отсутствуют в другом. Приведем здесь небольшой пример задач, которые можно решить, используя метод разности, с данными из учебных баз данных:

Показать клиентов, имена которых не совпадают с именами сотрудников .

Найти всех клиентов заказавших мотоцикл, но не заказавших шлем .

Привести список эстрадных артистов, которые отыграли ангажементы для клиентов Бонниксен, но не сыграли ни одного ангажемента для клиентов Росалес .



1 ... 62 63 64 [ 65 ] 66 67 68 ... 152

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика