Как преобразовать этот SQL, чтобы он использовал меньше подзапросов? - PullRequest
0 голосов
/ 11 июня 2010
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 содержит номера и названия эпизодов.

Я пробовал использовать несколько JOINно затем я получаю дублированные результаты, потому что в таблице serie_details есть несколько строк.Запрос был:

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

Ответы [ 2 ]

2 голосов
/ 11 июня 2010

Использование:

   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 голосов
/ 11 июня 2010

Лучше всего оставить его, используя подзапросы. Не уверен насчет postgressql, но MS SQL прекрасно их оптимизирует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...