объединение всех в SQL (Postgres) беспорядок - PullRequest
0 голосов
/ 12 июня 2018

У меня есть запрос, который является порядком по дате, есть запрос, который я немного упростил, но в основном это:

select * from 
(select  start_date, to_char(end_date,'YYYY-mm-dd') as end_date from date_table
order by start_date ,end_date ) 
where start_date is null or end_date is null

Показывает порядок префектов

, но я добавляю

union all
select start_date, 'single missing day' as end_date  from 
calendar_dates
where db_date>'2017-12-12' and db_date<'2018-05-13'     

Тогда весь заказ испортился.Почему это случилось?Объединение или объединение все должны просто добавить набор данных из первого запроса со вторым, верно?Это не должно испортить порядок в первом запросе, верно?

Я знаю, что этот запрос не имеет никакого смысла, но я упростил его, чтобы показать синтаксис.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

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

планировщик запросов выполнит ваши запросы в любом порядке.Вот почему у вас есть предложение ORDER BY.Используйте его!

Например, если вы хотите задать порядок первого запроса, а затем второго, выполните:

select * from 
(select  1, start_date, to_char(end_date,'YYYY-mm-dd') as end_date from date_table
order by start_date ,end_date ) 
where start_date is null or end_date is null
union all
select 2, start_date, 'single missing day' as end_date  from 
calendar_dates
where db_date>'2017-12-12' and db_date<'2018-05-13' 
ORDER BY 1
0 голосов
/ 12 июня 2018

Вы ошибаетесь.Этот запрос:

select d.*
from (select start_date, to_char(end_date,'YYYY-mm-dd') as end_date
      from date_table
      order by start_date, end_date
     ) d
where start_date is null or end_date is null

не "показывает идеальный порядок".Может случиться так, что вы произведете заказ, который вы хотите, но это совпадение. Единственный способ получить результаты в определенном порядке - использовать ORDER BY в крайнем SELECT. Период.

Итак, если вы хотите получить результаты в определенном порядке, используйтеorder by:

select d.*
from ((select d.start_date, to_char(end_date, 'YYYY-mm-dd') as end_date, 1 as ord
       from date_table d
       where d.start_date is null or d.end_date is null
       order by start_date, end_date
      ) union all
      (select cd.start_date, 'single missing day' as end_date, 2 as ord
       from calendar_dates cd
       where cd.db_date > '2017-12-12' and cd.db_date < '2018-05-13' 
      )
     ) d
order by ord, start_date;
...