2009-11-09 2 views
7

맨 위에 특정 레코드 (레코드의 기본 ID에서 찾은)를 표시하고 그 아래에 다른 모든 레코드를 표시하는 쿼리를 조합하려고합니다. 날짜별로 정렬됩니다 (기본 ID 외에도 테이블의 필드 중 하나 인 "date_added"가 있음).상단에 하나의 특정 레코드가있는 SQL

UNION (첫 번째 선택은 내가 원하는 레코드를 찾고 다른 레코드는 다른 모든 레코드를 표시합니다)로 할 수 있지만 아마도 더 좋은 방법이 있는지 궁금합니다.

나는 그런데 오라클을 사용하고 있습니다.

답변

17

당신은 두 개의 필드

으로 정렬하여이 작업을 수행 할 수 있습니다

행이 당신이 원하는 하나 하나가 외설 경우 경우 0을 반환하는 식 것이 첫 번째 '티. Sort는 오름차순이므로 원하는 레코드를 먼저 얻습니다.

두 번째 정렬 필드는 date_added이므로 나머지 레코드는이 순서로 정렬됩니다.

두려워 나는 간단한 방법은 당신이 두 개의 분리 된 것을 표시하기 때문에 간단한 쿼리를 분리하는 기록 할 것을 인식하는 것입니다

select * 
from the_table 
order by (case id when 999 then 0 else 1 end), date_added desc 
+0

답변 해 주셔서 감사합니다. 그런데 "순서 0"은 무엇을 의미합니까? 나는 이것을 사용할 수 없다는 것을 알았다. 단지 "ORDER BY 0". ("ORDER BY 항목은 SELECT 목록 표현식의 숫자 여야합니다.") – Dario

+1

'ORDER BY '은 Oracle에서 특별한 의미를 가지며 n 번째 열로 정렬됩니다. 물론 0 번째 열은 없습니다. CASE에서는 모든 행에 새로운 열을 추가하고 그 열을 정렬합니다. 새 열은 일치하는 기본 키의 경우 1이고 다른 모든 경우 0입니다. – Andomar

1

내가 정확히 오라클 모르지만, 당신은 아마 뭔가를 할 수있는 ..

ORDER BY IF(id == THE_ID, 0, 1), date_added 
+0

+1 오라클이 그런 식으로 IF를 지원하는지 확실하지 않습니다! – Andomar

+0

오라클은 IIF를 지원하지 않지만 대신에 – Andomar

7

쉬운 방법은 구조에 의해 멋진 순서 일 것이다. 여기에 PK에 대한 예제 = 123 :

select * 
from YourTable 
order by case when yourpk = 123 then 1 else 2 end, date_added 
+0

인'DECODE (id, THE_ID, 0,1) '를 사용하면 특정 레코드를 끝에 "... then else else end ..." –

+0

@ammoQ : 감사합니다. 답변이 수정되었습니다 (reko_t는 (게) 같은 생각을 일찍 게시했습니다) – Andomar

-1

같은 SQL 서버에있을 무언가에 의해 신탁을 모른다. 첫 번째 레코드를 검색하는 쿼리 하나와 정렬 된 목록을 검색 할 두 번째 쿼리 하나의 고유 한 레코드로 인해 이보다 더 많은 작업을 수행하는 데 실제 성능 이점이 없습니다.

+0

그렇습니다. 그러나 단일 SQL 문으로 수행하는 것이 이점이 있습니다. 일부 환경 (예 :보고 제품군)은 SQL 구문을 쉽게 재사용 할 수 없기 때문에 대부분의 SQL을 두 번 반복해야 할 수도 있으므로 유지 관리에 문제가 있습니다. 또한, SQL에서 그것을 더 consise입니다 :-). – sleske

0
SELECT * 
FROM `Table` 
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC 
0

당신은 다른 *

선택 날짜별로 정렬 모든 것을 다음 9백98초

999 첫째 같은 기술을 사용하여 상단에 더 이상의 레코드를 정렬 할 수 있습니다

from the_table 
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc 
관련 문제