2011-01-14 7 views
5

와 SELECT 나는에 의해 순서가 UNION 후 올 것이 오류를 받고 있어요하지만 난 쿼리 전에 하나에 결합 주문 후 10SQL : UNION, ORDER BY와 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 제한에이 원하는 당신이 이해하기를 바란다. 내가 무엇을하려고 노력하고 있고 나를 도울 수있다 ;-)

+0

그것은 SQLite를위한 것입니다 : android.database.sqlite.SQLiteException : ORDER BY 절은 전에 UNION 다음에 와야합니다 : –

답변

4

그것은 적어도 MySQL에서는 (당신이 지정하지 않은) 그것이 작동하는 방법이 아니다. ORDER 연산은 데이터가 선택되고 모든 UNION, GROUP BY 등이 수행 된 후에 발생합니다.

이 문제를 해결하기 위해 SQL Server: ORDER BY in subquery with UNION을 참조하십시오.

7

주문은 전체 조합에 영향을 미칩니다.

어쨌든 now에 가장 가까운 행을 원하는 것으로 보입니다. 당신은 이것을 시도 할 수 있습니다 :

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

덕분에,이게 다라고 생각합니다. –

4

"standard"("standard"의 정의에 따라) 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 구현에 따라 다를 수 있습니다. 당신이 SQLite는 매우 복잡한 쿼리가 있지만 순서와 UNION을 사용해야 할 경우

21

, 당신은 시도 할 수

 
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

다음과 같이 내가 적용된 쉬운 솔루션이었다 :

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 함수를 적용 할 수 있습니다. 그렇지 않으면 필요하지 않습니다.