|
Программирование >> Исключение дубликатов строк
Разность между рецептами Джона и Майкла представляет собой рецепты из поваренной книги Джона, которые отсутствуют в поваренной книге Майкла:
Снова воспользуемся графическим представлением множеств, чтобы наглядно показать, как работает операция разности. Предположим, что имеется БД, содержащая все ваши любимые рецепты. Вам очень не нравится вкус лука с говядиной, поэтому нужно найти все рецепты с говядиной, но без лука. На рис. 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. Вначале нужно найти множество рецептов, содержащих говядину, затем получить разность либо с множеством рецептов, содержащих лук, либо с множеством, содержащим морковь. Возьмите этот результат и получите разность с оставшимся множеством (луком или морковью), чтобы оставить только те рецепты, которые содержат говядину, но не содержат морковь или лук (область штриховки светлого тона на верхнем круге). Зодочи, которые можно решить, используп розность В отличие от пересечения (при котором осуществляется поиск общих элементов двух множеств) разность ищет элементы, которые имеются в одном множестве, но отсутствуют в другом. Приведем здесь небольшой пример задач, которые можно решить, используя метод разности, с данными из учебных баз данных: Показать клиентов, имена которых не совпадают с именами сотрудников . Найти всех клиентов заказавших мотоцикл, но не заказавших шлем . Привести список эстрадных артистов, которые отыграли ангажементы для клиентов Бонниксен, но не сыграли ни одного ангажемента для клиентов Росалес .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |