2011-01-14 21 views
5

estoy recibiendo errores que ordenar antes de venir después de UNIÓN pero yo quisiera que éstos consultas ordenadas antes combinado a uno y luego limitado a 10.SQL: SELECT con UNION, ORDER BY y LIMIT

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 

I Espero que entiendas, lo que estoy tratando de hacer y puede ayudarme ;-)

+0

Es para SQLITE: android.database.sqlite.SQLiteException: la cláusula ORDER BY debe venir después de UNION no antes: –

Respuesta

4

Así no es como funciona, al menos en MySQL (no especificó). La operación ORDER se produce después de que se seleccionan los datos y se han realizado todos los UNION, GROUP BY, etc.

Consulte SQL Server: ORDER BY in subquery with UNION para solucionar este problema.

7

Un pedido por afectará a la unión ENTERA.

De todos modos, parece que quiere las filas más cercanas a now. Puede intentar esto:

SELECT time, x, y, z 
FROM  db 
ORDER BY ABS(time - now) ASC 
LIMIT 10 
+0

gracias, creo que esto es ... –

4

En "estándar" (para algunas definiciones de "estándar") 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 

Cómo limitar el número de filas en el conjunto de resultados puede variar entre las implementaciones de SQL.

21

si usted tiene una consulta muy compleja en SQLite, pero necesita usar la unión con el pedido, entonces puede intentar

 
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 
    ) 
2

Cualquier solución fácil He aplicado fue el siguiente:

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; 

Este pedidos los resultados por la segunda columna (fecha).

Si la columna de fecha es una cadena, puede aplicar la función TO_DATE como se muestra arriba, de lo contrario no es necesario.

Cuestiones relacionadas