2010-06-10 3 views
0
SELECT s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding, 
     (SELECT titel FROM serie_details WHERE taalcode = 'oo' AND serie_id = s.id) AS titel, 
     (SELECT beschrijving FROM serie_details WHERE taalcode = 'oo' AND serie_id = s.id) AS beschrijving, 
     ARRAY_AGG(d.titel) AS alt_titels, 
     (SELECT ARRAY_AGG(num[1]) FROM afleveringen WHERE serie_id = s.id) AS afleveringen, 
     (SELECT COUNT(id) FROM afleveringen WHERE serie_id = s.id) AS totaal 
FROM series AS s 
LEFT JOIN serie_details AS d ON d.serie_id = s.id 
WHERE s.id = 6 
GROUP BY s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding 

series이 시리즈와 테이블, serie_details 시리즈에 대한 대체 이름을 포함하고 afleveringen 그 에피소드에 대한 에피소드 번호 및 제목을 포함합니다.하위 쿼리를 덜 사용하도록이 SQL을 변환하는 방법은 무엇입니까?

serie_details 테이블에 여러 행이 있기 때문에 여러 개의 JOIN을 사용해 보았지만 중복 결과가 나타납니다. 검색어 :

SELECT s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding, COUNT(a.id) AS totaal, 
     (select titel from serie_details where taalcode = 'oo' and serie_id = s.id) AS titel, 
     (select beschrijving from serie_details where taalcode = 'oo' and serie_id = s.id) AS beschrijving, 
     ARRAY_AGG(a.num[1]) AS afleveringen, 
     ARRAY_AGG(d.titel) AS alt_titels 
FROM series AS s 
LEFT JOIN afleveringen AS a ON a.serie_id = s.id 
LEFT JOIN serie_details AS d ON d.serie_id = s.id 
WHERE s.id = 6 
GROUP BY s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding 
+0

하위 쿼리가 부족한 이유가 있습니까? 기본적으로 작은 데이터 집합에서 JOIN을 수행하는 것입니다. –

+0

순수하게 성능상의 이유로. – EarthMind

+0

성능이 개선 될 것이라는 것을 알고 있습니까? – ChrisF

답변

2

사용 :

SELECT s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding, 
      x.titel, 
      x.beschrijving, 
      ARRAY_AGG(d.titel) AS alt_titels, 
      y.afleveringen, 
      y.totaal 
    FROM SERIES s 
LEFT JOIN serie_details AS d ON d.serie_id = s.id 
LEFT JOIN (SELECT sd.serie_id, 
        sd.titel, 
        sd.beschrijving 
      FROM SERIE_DETAILS sd 
      WHERE sd.taalcode = 'oo') x ON x.serie_id = s.id 
LEFT JOIN (SELECT a.serie_id, 
        ARRAY_AGG(num[1]) AS afleveringen, 
        COUNT(id) AS totaal 
      FROM afleveringen a 
     GROUP BY a.serie_id) y ON y.serie_id = s.id 
    WHERE s.id = 6 
GROUP BY s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding, x.titel, x.beschrijving, y.afleveringen, y.totaal 

당신은 GROUP BY 절 누락 된 실현?

+0

'GROUP BY' 열을 추가하려고 시도했지만 쿼리가 여러 행을 반환했습니다. – EarthMind

+0

@EarthMind : 여러분의 질의는'titel' col을 단일 열로 그리고 집계 배열로 반환합니다. 집계 배열 만 필요합니다. 그렇다면'beschrijving' 컬럼을 다루어야 만합니다 ... –

+0

'titel'이라는 단 하나의 컬럼이있는 이유는 공식 타이틀을 기본 (taalcode = 'oo')으로 사용하고 나머지는 선택하기 때문입니다 복잡한 질의없이 집계 배열 (taalcode = 'en', 'fr'등)으로 표제를 정렬합니다. – EarthMind

-1

가장 좋은 방법은 하위 쿼리를 사용하여 남겨 두는 것입니다. postgressql에 대해서는 잘 모르겠지만, ms SQL은이를 잘 최적화합니다.

+1

아니요. 상관 관계가없는 하위 쿼리는 행 단위로 처리하기 때문에 큰 성능 문제를 일으 킵니다. 조인은 거의 항상 훨씬 빠릅니다. – HLGEM

+0

@HLGEM : 하위 쿼리와 대규모 그룹의 조인 비교? 너 농담이야? – NotMe

관련 문제