SQL嵌套子查询

时间:2015-10-29 00:09:01

标签: sql postgresql

我有一个音乐数据库的“相册”模式。

此架构包括属性:名称,艺术家,评级和年份。

我正在尝试创建一个查询,这样我就可以获得所有专辑的名称,这些专辑的评分高于同一个人的每张专辑。我需要检查数据库中的每个元组,并比较艺术家相同的元组,以及一张专辑的年份大于另一年的年份,并比较评级。

我尝试过使用不同策略的一些不同的东西。我目前的尝试是嵌套查询:

SELECT A1.Title
FROM Album A1
WHERE A1.Title NOT IN (SELECT A2.Title
                FROM Album A2
                WHERE A1.Artist = A2.Artist, A1.Year > A2.Year, A1.Rating > A2.Rating);

这显然不起作用(因此我的问题) - 我哪里错了?我认为一个相关的查询(像这一个)检查表中的每个元组与子查询?关于如何进行此查询的任何许可都表示赞赏。我是SQL的新手。

2 个答案:

答案 0 :(得分:1)

我会使用窗口函数:

select a.*
from (select a.*,
             max(a.rating) over (partition by a.artist
                                 order by a.year
                                 range between unbounded preceding and 1 preceding
                                ) as prev_max_rating
      from album a
     ) a
where rating > prev_max_rating;

答案 1 :(得分:1)

(在用AND替换逗号之后)NOT EXISTS(...)NOT IN(...)类似,但如果涉及NULL则表现更好

SELECT A1.Title
FROM Album A1
  -- There should not exist an older album with a higher rating
  -- (for the same artist)
WHERE NOT EXISTS (SELECT *
   FROM Album A2
   WHERE A2.Artist = A1.Artist
     AND A2.Year < A1.Year
     AND A2.Rating > A1.Rating -- Note: the sign is flipped, compared to the query in the question
     );
相关问题