2012-07-11 2 views
2

목적지 ID가 있으며 다른 목적지를 선택하고 싶습니다. 지정된 목적지의 국가에서 먼저 주문한 다음 다른 목적지를 선택합니다.어떻게 주어진 목적지 국가에 따라 목적지를 주문할 수 있습니까?

destination: 
- id 
- name 

destination_visa 
- id_destination 
- id_visa 

visa 
- id_visa 
- country 

가 어떻게이 대상의 국가에 따라 다른 대상을, 지정된 목적지의 국가를 선택하고 주문합니까 (바람직하게는 하위 쿼리를 사용하지 않고), 바람직하게는 하위 쿼리를 사용하지 않고?

SQLFiddle : http://sqlfiddle.com/#!2/31503/3

답변

2

변수에 미리 선택 할 수있는 하위 쿼리는 여전히있다 Is this what you had in mind?

select 
    d.id_destination, v.country, d.name 
from 
    destination d 
    inner join destination_visa dv on dv.id_destination = d.id_destination 
    inner join visa v on dv.id_visa = v.id_visa 
order by nullif (v.country, (select v2.country 
          from destination_visa dv2 
          inner join visa v2 
          on dv2.id_visa = v2.id_visa 
          where dv2.id_destination = 6)); 

.

하위 쿼리는 외부 쿼리와 상관 관계가 없으므로 문제가 발생하지 않는다고 생각합니다. 즉, 한 번만 실행해야한다는 의미입니다. by order에 관해서는 우선 null이 정렬되므로 주어진 대상과 일치하는 국가를 무효화하는 데 사용됩니다. 또는이를 사용하여 더 명확하게 만들 수 있습니다.

order by case when v.country = (select v2.country 
           from destination_visa dv2 
           inner join visa v2 
           on dv2.id_visa = v2.id_visa 
           where dv2.id_destination = 6) 
       then 0 -- Move matching country to front 
       else 1 -- Not a matching country 
     end, 
     v.country 
+0

예! order by 절을 설명해 주시겠습니까? 또한 이러한 방식으로 하위 쿼리를 사용하는 복잡성에 대해 조금 이야기 할 수 있습니까? – brainydexter

+0

@brainydexter 답변을 다시 확인하십시오. –

+0

완벽! 설명 주셔서 감사합니다, 다른 예제는 나를 이해하는 데 도움이. 나는'nullif'와 관련된 질문을 가지고 있습니다. nullif는 조건이 참이면 null을 반환합니다. 그러나 '진정한 주문'(또는 '거짓')은 무엇을 할 것인가? – brainydexter

관련 문제