Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Комбинированные запросы

Включение или исключение повторяющихся строк

      Возвратимся к одному из предыдущих разделов "Использование оператора UNION" и рассмотрим использованные в нем простые операторы SELECT. Вы можете заметить, что, когда они выполняются отдельно, первый оператор SELECT возвращает три строки, второй — две. Однако когда эти два оператора SELECT комбинируются с UNION, возвращаются только четыре строки, а не пять.

      Запрос UNION автоматически удаляет все повторяющиеся строки из набора результатов запроса (иными словами, он ведет себя точно так же, как вели бы себя несколько предложений WHERE в одном операторе SELECT). Поэтому здесь присутствует запись о клиенте Fun4All из штата Индиана — эта строка была возвращена обоими операторами SELECT. Когда же использовался запрос UNION, повторяющаяся строка была удалена.

      Таково поведение запроса UNION по умолчанию, но при желании вы можете изменить его. Если бы требовалось, чтобы возвращались все вхождения соответствий, вам следовало бы использовать UNION ALL вместо оператора UNION.

      Рассмотрим следующий пример:

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL•,'IN','MI')
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'; 



cust_name        cust_contact          cust_email 
---------------  --------------------  --------------------------------
Village Toys     John Smith            sales@villagetoys.com
Fun4All          Jim Jones             jjones@fun4all.com
The Toy          Store Kim Howard      NULL
Fun4All          Jim Jones             jjones@fun4all.com
Fun4All          Denise L.Stephens     dstephens@fun4all.com

     При использовании запроса UNION ALL СУБД не удаляет дубликаты. Поэтому в предыдущем примере возвращено пять строк, одна из них повторяется дважды.

UNION ИЛИ WHERE

В начале этого урока мы говорили, что оператор union выполняет то же самое, что и несколько условий where. Оператор union all является формой запроса union, которая делает то, что не способны выполнить предложения where. Если вы хотите получить все вхождения соответствий для каждого условия (включая дубликаты), вам следует использовать оператор union all, а не where.