Результат SQL A Union B отличается от результата A + B?

Я использовал Union для объединения двух SQL-запросов, но результаты отличаются от комбинации двух разных запросов. Ниже мой код SQL:

(SELECT CONCAT(Name, '(', LEFT(Occupation, 1), ')')
FROM OCCUPATIONS
ORDER BY Name ASC)
UNION
(SELECT CONCAT('There are a total of ', COUNT(Occupation), ' ', 
LOWER(Occupation), 's.')
FROM OCCUPATIONS
GROUP BY Occupation
ORDER BY Occupation ASC)

Если я выполню только первую половину запроса, я получу следующий результат:

Aamina(D) 
Ashley(P) 
Belvet(P) 
Britney(P) 
Christeen(S) 
Eve(A) 
Jane(S) 
Jennifer(A) 
Jenny(S) 
Julia(D) 
Ketty(A)  
Kristeen(S) 
Maria(P) 
Meera(P) 
Naomi(P) 
Priya(D) 
Priyanka(P) 
Samantha(A) 

Если я выполню только вторую половину запроса, я получу следующий результат:

There are a total of 4 actors. 
There are a total of 3 doctors. 
There are a total of 7 professors. 
There are a total of 4 singers. 

Оба результата приведены в ожидаемом порядке. Однако, если я выполню весь запрос, я получу следующий результат:

Ashley(P) 
Samantha(A) 
Julia(D) 
Britney(P) 
Maria(P) 
Meera(P) 
Priya(D) 
Priyanka(P) 
Jennifer(A) 
Ketty(A) 
Belvet(P) 
Naomi(P) 
Jane(S) 
Jenny(S) 
Kristeen(S) 
Christeen(S) 
Eve(A) 
Aamina(D) 
There are a total of 4 actors. 
There are a total of 3 doctors. 
There are a total of 7 professors. 
There are a total of 4 singers. 

Как вы могли заметить, порядок первой половины не совсем точен. Кто-нибудь знает почему? Чем Union отличается от написания двух отдельных SQL-запросов? Спасибо!

Только последний ORDER BY в UNIOIN соблюдается.

PM 77-1 13.03.2018 21:31
UNION несет неявный оператор DISTINCT. Попробуйте UNION ALL.
Bacon Bits 13.03.2018 21:33

@BaconBits Я считаю, что результатов нет, они только в неожиданном порядке.

TJ_ 13.03.2018 21:35

Да, результатов нет, только в неожиданном порядке.

CathyQian 13.03.2018 21:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
56
1

Ответы 1

Порядок не "прикручен". У вас нет order by для общего запроса, только для подзапросов. Порядок не сохраняется. Вы используете UNION, который удаляет дубликаты.

Безопасный способ выполнить этот запрос:

select str
from ((select concat(Name, '(', LEFT(Occupation, 1), ')') as str, 1 as which
       from OCCUPATIONS
      ) union all
      (select concat('There are a total of ', COUNT(Occupation), ' ', 
lower(Occupation), 's.') as str, 2 as which
       from OCCUPATIONS
       group by occupation
      )
     ) o
order by which, str

Спасибо! Почему в конце вы используете order by which str?

CathyQian 13.03.2018 21:47

@CathyQian Потому что which и str - это два поля в подзапросе, составляющем предложение from. which имеет фиксированное значение 1 в первой части запроса и фиксированное значение 2 во второй части. Это заставляет сортировку сохранять описанный вами порядок.

Bacon Bits 13.03.2018 21:52

Кстати, ваш код работает отлично! Я просто не понимаю, почему порядок в подзапросах не сохраняется при использовании UNION? Могу ли я изучить какие-либо ресурсы? Спасибо!

CathyQian 13.03.2018 21:52

@CathyQian. . . У вас нет order by для общего запроса. Следовательно, результаты расположены в произвольном порядке.

Gordon Linoff 14.03.2018 04:06

Другие вопросы по теме