如何转换此SQL以便使用较少的子查询?

如何转换此SQL以便使用较少的子查询?,sql,postgresql,Sql,Postgresql,series是包含该系列的表格,serie\u details包含该系列的备选名称,afleveringen包含这些剧集的剧集编号和标题 我尝试过使用多个联接,但结果重复,因为serie\u details表中有多行。问题是: SELECT s.id, s.show_start, s.show_end, s.bekeken, s.website, s.afbeelding, (SELECT titel FROM serie_details WHERE taalcode = 'o

series
是包含该系列的表格,
serie\u details
包含该系列的备选名称,
afleveringen
包含这些剧集的剧集编号和标题

我尝试过使用多个联接,但结果重复,因为
serie\u details
表中有多行。问题是:

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

最好使用子查询将其保留。不确定postgressql,但ms sql对其进行了优化。

使用:

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

您是否意识到缺少GROUP BY子句?

是否有任何原因希望减少子查询?你基本上只是在一个较小的数据集上进行连接。纯粹出于性能原因。你知道你会在性能上得到改进吗?我不确定,但这就是我想测试的。你已经创建了一些索引吗?他们可能会加快您的查询速度。我尝试添加
GROUP BY
列,但随后查询返回了多行。@EarthMind:嗯,您的查询将
titel
列作为单个列和聚合数组返回-我想您确实只需要聚合数组。但是,您必须处理
beschrijving
列……还有一列
titel
的原因是,我想使用官方标题作为默认标题(其中taalcode='oo'),并选择其余标题作为聚合数组(其中taalcode='en','fr',等等)没有任何复杂的疑问。@EarthMind:我明白;我没有数据&您的数据模型概念有限,所以我不知道什么是有效的&什么不是。那么,哪些列提供了重复项呢?
id=6
的序列在
serie\u details
表中有两条记录,在
afleveringen
表中有14条记录,对于
count(afleveringen.id),使用多个左联接的我的查询返回了28条记录
和重复的
serie\u details.titel
列。不,不是这样,相关子查询会导致巨大的性能问题,因为它们强制逐行处理。联接几乎总是要快得多。@HLGEM:子查询与具有大分组的联接相比?你在开玩笑吧?
   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