SQL忽略了我的条件?

时间:2015-11-06 07:37:12

标签: sql postgresql

第一次使用SQL所以请耐心等待我的是一个愚蠢的错误。 我的数据库有3个表。但是对于此查询,我们只关注ALBUM表。对于每张专辑,它包含出版年份,艺术家姓名,专辑名称,专辑评级。

我正在努力寻找两张专辑在一定年限内没有进一步分开的结果。

这就是我提出的:

SELECT "ALBUM"."ARTIST" 
FROM public."ALBUM"     
WHERE NOT EXISTS
(SELECT "A"."ARTIST"    
FROM public."ALBUM" AS "A" 
WHERE NOT EXISTS
( SELECT "B"."ARTIST"
FROM 
  public."ALBUM" "A", 
  public."ALBUM" "B"
WHERE 
  "A"."TITLE" != "B"."TITLE" AND    
  "A"."ARTIST" = "B"."ARTIST" AND
  "B"."YEAR"  <= "A"."YEAR" AND 
  "B"."YEAR" +4 < "A"."YEAR"
  )   
) 
UNION
SELECT "A"."ARTIST" 
FROM public."ALBUM" "A"
WHERE NOT EXISTS
( SELECT "B"."ARTIST"
FROM  public."ALBUM" "B"
WHERE "A"."ARTIST" = "B"."ARTIST"
AND "A"."TITLE" != "B"."TITLE") ;

我的想法是:我首先找到所有那些至少存在两张专辑的艺术家,但是对于一张专辑,4年内没有其他专辑,然后我会从所有艺术家的集合中减去这一组。联盟部分是为了向我的结果添加那些只发布了1张专辑的人。

代码在PostgreSQL中运行良好,但返回的数据实际上并没有按照提供的标准进行过滤,因此代码中的某些内容被忽略/无法正常工作但我现在已经停留了一段时间。有提示吗?

2 个答案:

答案 0 :(得分:0)

我建议采用两步法:

1:单一自我联接查询找到艺术家。

SELECT "B"."ARTIST"
FROM 
  public."ALBUM" "A", 
  public."ALBUM" "B"
WHERE 
  "A"."TITLE" != "B"."TITLE" AND    
  "A"."ARTIST" = "B"."ARTIST" AND
  "B"."YEAR" < "A"."YEAR" + 4
  1. 尝试在NOT EXISTS子句中包装第一个查询。

    SELECT ARTIST FROM public."ALBUM" "C" WHERE NOT EXISTS    
    (SELECT "B"."ARTIST"
     FROM 
      public."ALBUM" "A", 
      public."ALBUM" "B"
     WHERE 
      "A"."TITLE" != "B"."TITLE" AND    
      "A"."ARTIST" = "B"."ARTIST" AND
      "A"."ARTIST" = "C"."ARTIST" AND
      "B"."YEAR" < "A"."YEAR" + 4)
    
  2. 请注意,必须将EXISTS的外部和内部查询与某些内容绑定才能使其正常工作。我认为,你对年度比较的条件是相反的。

答案 1 :(得分:0)

组合CTE(公用表表达式)和窗口函数的另一种方法可以如下:

with single_album as 
    (select artist, count(artist) as albums 
     from album 
     group by artist),
    album_year_delta as
    (select 
        artist,
        album_year,
        (album_year - 
        lag(album_year,1)
        over(partition by artist order by album_year)) as year_difference
    from album)
select 
    artist 
from single_album 
where 
    albums=1
union
select
    artist
from album_year_delta
where year_difference > 4;
  1. 首先,您可以识别单个专辑艺术家的简单计数
  2. 计算每个专辑发行年之间的时间间隔
  3. 指定您的选择标准
  4. 注意:为简化起见,我简化了命名约定,因为双引号和表前缀有点重。 希望这会有所帮助。