2012-01-25 2 views
1

내 질문에, 빠른 쿼리를 다음 쿼리 수 있습니까? 내가 오라클 10g고유 한 값으로 SQL - 그룹

을 사용하고

내가 테이블 제조 업체 및 차량을 말해봐, 나는 열 'Car.Name'의 모든 항목을 계산합니다. 여기에 내가 그것을 할 거라고 어떻게 :

SELECT manuf.Name, COUNT(car1.Name), COUNT(car2.Name), COUNT(car3.Name) 
FROM Manufacturer manuf 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari1') car1 ON manuf.PK = car1.ManufPK 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari2') car2 ON manuf.PK = car2.ManufPK 
LEFT JOIN (SELECT * FROM Car c where c.Name = 'Ferrari3') car3 ON manuf.PK = car3.ManufPK 
GROUP BY manuf.Name 

이 결과 구함 :

Manufacturer | Ferrari1 | Ferrari2 | Ferrari3 
---------------------------------------------- 
Fiat   | 1  | 0  | 5 
Ford   | 2  | 3  | 0 

내가 몇 LEFT 조인과 함께이 시도를하고 괜찮 았는데. 그러나 (90+와 같이) 많이 추가했을 때, 매우 느리게 (1 분 이상) 느려졌습니다.

내 질문에이 쿼리를 수행하는 더 빠른 방법이 있습니까? 귀하의 질문은 매우 명확하지 않다 :

SELECT manuf.Name, c.Name, COUNT(*) Cnt 
FROM Manufacturer manuf 
LEFT JOIN Car c ON manuf.PK = c.ManufPK 
GROUP BY manuf.Name, c.Name 

PS 필요에 따라

+0

당신이 당신의 이전 쿼리가 무엇 이었습니까 우리를 게재 할 수 있습니까? – everton

+0

@WoF_Angel 어떤 RDBMS를 사용하십니까? MySQL에서는 'PIVOT'에 대해 MSSQL에서 'GROUP_CONCAT'을 사용하는 것에 대해 생각할 수 있습니다 –

+1

[올바른 색인을 사용하면 여러 조인이 PIVOT/GROUP BY만큼이나 잘 수행 될 것입니다] (http://stackoverflow.com/questions/) 7448213/sql-server-pivot-vs-multiple-join/7449213 # 7449213) –

답변

3

, 시도 : 당신이 페이지를 통해 개별 자동차를 참조해야하는 경우

select m.Name manufacturer_name, 
     c.Name car_name, 
     count(*) 
from Manufacturer m 
left join Car c 
     on m.PK = c.ManufPK and c.Name in ('Ferrari1','Ferrari2','Ferrari3') 
group by m.Name, c.Name 

이 시도 :

select m.Name manufacturer_name, 
     sum(case c.Name when 'Ferrari1' then 1 else 0 end) Ferrari1_Count, 
     sum(case c.Name when 'Ferrari2' then 1 else 0 end) Ferrari2_Count, 
     sum(case c.Name when 'Ferrari3' then 1 else 0 end) Ferrari3_Count 
from Manufacturer m 
left join Car c 
     on m.PK = c.ManufPK and c.Name in ('Ferrari1','Ferrari2','Ferrari3') 
group by m.Name 
+0

그는 그것을 언급했다. – everton

+2

@aF 그래서 뭐? 이것은 필요에 어울리지 않습니다. 그래서 우리는 세련된 질문이 필요합니다. –

+0

2 번째 제안을 사용했습니다. 매우 잘 작동합니다. 감사. –

0
SELECT manuf.Name, COUNT(DISTINCT c.Name) 
FROM Manufacturer manuf 
LEFT JOIN Car c ON manuf.PK = c.ManufPK 
GROUP BY manuf.Name 

또는. 당신은 자동차가 페이지를 카운트 다운보고 행복 경우 답을 수정하는 몇 가지 원하는 결과 집합을 제공

+0

같은 행에 모든 카운트를 제공하지는 않습니다. –

+0

@ MarkBannister 댓글 응답보기 –

0

당신이 시도 할 수 있습니다 :

SELECT manuf.Name 
    , car1.cnt AS Ferrari1 
    , car2.cnt AS Ferrari2 
    , car3.cnt AS Ferrari3 
FROM 
     Manufacturer AS manuf 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari1' 
     GROUP BY ManufPK 
    ) AS car1 
    ON car1.ManufPK = manuf.PK 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari2' 
     GROUP BY ManufPK 
    ) AS car2 
    ON car2.ManufPK = manuf.PK 
    LEFT JOIN 
     (SELECT ManufPK, COUNT(*) AS cnt 
     FROM Car 
     WHERE Name = 'Ferrari3' 
     GROUP BY ManufPK 
    ) AS car3 
    ON car3.ManufPK = manuf.PK 
ORDER BY manuf.Name 
관련 문제