0

이 조회는 각 대륙의 최대 국가를 찾습니다. 대륙, 이름 및 지역을 보여줍니다.SQL 상관 부속 조회 이벤트 순서

SELECT 
    c1.continent, 
    c1.name, 
    c1.area 
FROM 
    countries c1 
WHERE 
    c1.area = (
     SELECT 
      MAX(c2.area) 
     FROM 
      countries c2 
     WHERE 
      c1.continent = c2.continent 
     ) 

내가 제대로 서브 쿼리가 같은 대륙 모든 C2 항목에 C1에서 각 항목의 대륙과 일치 최대를 찾을 수 이해 야합니다. 그렇다면 c1의 모든 항목에 대해 하위 쿼리가 실행됩니다. 그게 불필요하지 않은가?

누군가이 쿼리에서 발생하는 이벤트의 순서를 설명하고이를 수행하는 더 좋은 방법이 있는지 알려주십시오. 감사.

+0

당신이 사용하고있는 데이터베이스 창 기능을 사용하는 경우 표준 SQL이 일반적으로 훨씬 빠릅니다? 나는 오라클, MySQL 또는 SQL 서버를 의미합니까? – Aruna

+0

@ gordon-linoff의 답은 매우 훌륭한 대답입니다. 귀하의 RDBMS에 따라보다 효율적인 접근 방법에 관해서는, (i.name, rownum = ROW_NUMBER() OVER (PARTITION BY i.continent ORDER BY i.area DESC)의 하위 쿼리를 제안합니다. i) 조인 rownum = 1을 포함한 기준으로 모든 대륙에서 가장 큰 국가의 이름을 부여합니다. – Forty3

+0

@Aruna 저는 Postgres를 사용하고 있습니다 –

답변

2

SQL 쿼리는 절차가 필요 없음을 이해해야합니다. 결과 집합을 만드는 방법이 아니라 결과 집합을 설명합니다.

인덱스가 countries(continent, area)에있는 경우 "하위 쿼리"는 색인에서 간단히 조회하는 것입니다. 매우 효율적인 작업입니다.

인덱스를 사용할 수없는 경우 일부 데이터베이스 엔진은 하위 쿼리를 일종의 조인 작업으로 구현할만큼 스마트합니다. 일반적으로 데이터가 충분히 큰 경우 해시 조인을 사용합니다.

물론 일부 데이터베이스는 외부 쿼리의 각 행에 대해 하위 쿼리를 실행하여 본질적으로 중첩 루프 조인을 수행합니다. 그러나 엔진이이를 수행 할 필요는 없습니다.

1

고든은 이미 어떻게 처리되는지에 대한 답변을 제공했습니다.

Postgres가 공동 관련 하위 쿼리를 조인에 다시 쓰는지 여부를 알고 싶다면 explain (analyze) ...을 사용하여 실행 계획을 확인하십시오.


이 할 수있는 더 좋은 방법이 있다면.

예 있습니다. distinct on()를 사용하여 포스트 그레스와

select continent, name, area 
from (
    select continent, name, area, 
     dense_rank() over (partition by continent order by area desc) as rnk 
    from countries 
) t 
where rnk = 1; 

빠르게 윈도우 함수를 사용하여 솔루션을 다음 일반적으로 :

select distinct on (continent) * 
from countries 
order by continent, area desc