Я использовал 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-запросов? Спасибо!
UNION несет неявный оператор DISTINCT. Попробуйте UNION ALL.
@BaconBits Я считаю, что результатов нет, они только в неожиданном порядке.
Да, результатов нет, только в неожиданном порядке.


Порядок не "прикручен". У вас нет 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 Потому что which и str - это два поля в подзапросе, составляющем предложение from. which имеет фиксированное значение 1 в первой части запроса и фиксированное значение 2 во второй части. Это заставляет сортировку сохранять описанный вами порядок.
Кстати, ваш код работает отлично! Я просто не понимаю, почему порядок в подзапросах не сохраняется при использовании UNION? Могу ли я изучить какие-либо ресурсы? Спасибо!
@CathyQian. . . У вас нет order by для общего запроса. Следовательно, результаты расположены в произвольном порядке.
Только последний
ORDER BYвUNIOINсоблюдается.