2015-11-06 84 views
-1

使用SQL第一次,如果我的是一个愚蠢的错误,所以请耐心等待。我的数据库有3个表格。但是对于这个查询,我们只关注ALBUM表。对于每张专辑,它包含发行年份,艺术家姓名,专辑名称,专辑评分。SQL忽略我的状况?

我试图找到结果,其中两张专辑都没有更远的时间超过一定的年限。

这是我想出了:

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中,但返回的数据实际上并不在代码中提供这样的东西的条件筛选被忽略/不工作,但我一直停留在现在该怎么办了一段时间。任何提示?

+1

请添加样本数据,并输出演示该问题的样本数据。 –

+2

不相关,但是:你应该真的避免那些可怕的带引号的标识符。 –

+3

第一个SELECT工作是否独立?第二个SELECT工作是否独立? – jarlh

回答

0

我推荐2步法:

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 
  • 缠绕第一查询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) 
    
  • 请注意,您必须在EXISTS外部和内部查询绑定的东西,使其工作。此外,我认为,你的年度比较情况是相反的。

    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. 请指定您的选择条件

    不是e:为了清楚起见,我简化了命名约定,因为双引号和表前缀有点沉重。 希望这有助于。