MySql: Сохранение порядка в результате UNION ALL - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующее:

with
result1 as ( select column1 from table1 order by ... )
result2 as ( select column1 from table2 order by ... )
select * from result1 union all select * from result2;

Намерение состоит в том, чтобы перечислить result1 с сохранением его порядка , за которым следует result2 с сохранением его порядка . Однако оказывается, что union all не сохраняет порядок своих таблиц операндов. Как добиться желаемого эффекта? Я попытался добавить столбцы к упорядоченным result1 и result2, а затем заказать результат объединения в этом добавленном столбце, но это кажется ужасно сложным для чего-то, что кажется довольно типичным. Есть что-нибудь вроде union all ordered?

1 Ответ

0 голосов
/ 02 августа 2020

Хорошо. Вот как разбираться с «оконными функциями». Если вы используете MySQL 8 +

with
result1 as ( 
select column1, ROW_NUMBER() OVER (ORDER BY ...) AS rownum1, 0 AS rownum2, 
from table1 order by ...
),
result2 as ( 
select column1, 0 AS rownum1, ROW_NUMBER() OVER (ORDER BY ...) AS rownum2
from table2 order by ...
),
result as (
select * from result1 
union all
select * from result2 
)
     
select * from result order by rownum2, rownum1
...