SQL: SELECT с UNION, ORDER BY и LIMIT

Я получаю сообщения об ошибках, что ORDER by должен идти после UNION, но я хочу, чтобы эти запросы были упорядочены до объединения в один, а затем ограничены 10.

SELECT * 
  FROM (SELECT time, x, y, z 
          FROM db 
         WHERE time >= now 
      ORDER by time, x
       UNION 
       SELECT time, x, y, z 
         FROM db 
        WHERE time < now 
     ORDER by time, x) 
LIMIT 10

Надеюсь, вы понимаете, что я пытаюсь сделать, и можете мне помочь ;-)


person Tobias    schedule 14.01.2011    source источник
comment
Это для SQLITE: android.database.sqlite.SQLiteException: предложение ORDER BY должно идти после UNION, а не раньше:   -  person Tobias    schedule 15.01.2011


Ответы (5)


Это не так, по крайней мере, в MySQL (вы не уточнили). Операция ORDER выполняется после выбора данных и выполнения всех операций UNION, GROUP BY и т. д.

См. SQL Server: ORDER BY в подзапросе с UNION для путь вокруг этого.

person coreyward    schedule 14.01.2011

если у вас очень сложный запрос в SQLite, но вам нужно использовать UNION с порядком, вы можете попробовать

select * from (
    select * from b ORDER BY date asc
    )
UNION
select * from (
    select * from b ORDER BY name desc
    )
UNION
select * from (
    select * from b ORDER BY gender asc
    )
person hmaxf2    schedule 01.02.2012

Порядок повлияет на ВЕСЬ союз.

В любом случае, похоже, вам нужны строки, ближайшие к now. Вы можете попробовать это:

SELECT   time, x, y, z 
FROM     db 
ORDER BY ABS(time - now) ASC
LIMIT    10
person Andomar    schedule 14.01.2011

В «стандартном» (для некоторого определения «стандартного») SQL;

select top 10 *
from (       select time,x,y,z from db where time > now
       union select time,x,y,z from db where time < now
     ) t
order by t.time

Способ ограничения количества строк в результирующем наборе зависит от реализации SQL.

person Nicholas Carey    schedule 14.01.2011

Любое простое решение, которое я применил, было следующим:

SELECT 
 name,
 TO_DATE(date1, 'DD-MON-YYYY HH:MI AM')
FROM TableX

UNION

SELECT
 name,
 TO_DATE(date2, 'DD-MON-YYYY HH:MI AM')
FROM TableY

ORDER BY 2 DESC;

Это упорядочивает результаты по второму столбцу (дата).

Если столбец даты является строкой, вы можете применить функцию TO_DATE, как показано выше, иначе в этом нет необходимости.

person Allan    schedule 05.08.2015