当DISTINCT不会成功时选择特定记录

时间:2014-04-27 01:34:26

标签: sql ms-access ms-access-2013

我有两张桌子:

tbl_Artist
AristID
Name
Info

tbl_Ad
AdID
ArtistID
Venue
DateFrom
DateTo

艺术家可能会为不同的节目制作多个广告。我运行以下语句,根据广告中的日期选择日期范围内的艺术家。

SELECT DISTINCT tbl_Artist.Name, tbl_Ad.DateFrom, tbl_Ad.DateTo
FROM tbl_Artist INNER JOIN tbl_Ad ON tbl_Ad.AdID = tbl_Ad.ArtistID
WHERE DateFrom BETWEEN #12/1/2014# AND #12/10/2014#
OR DateTo BETWEEN #12/1/2014# AND #12/10/2014#
OR DateFrom < #12/1/2014# AND DatoTo > #12/10/2014#;

这给了我以下结果:

Artist1   02.12.14 - 10.12.14
Artist2   03.12.13 - 08.12.14
Artist2   03.12.13 - 07.12.14

其中一个节目的日期在另一个节目前一天结束,这使他两次出现。我想做一个选择,在07.12.14和08.12.14上显示2位艺术家,但在10.12.14只有一位。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先让我感到震惊的是:FROM tbl_Artist INNER JOIN tbl_Ad ON tbl_Ad.AdID = tbl_Ad.ArtistID联接条款应为tbl_Ad.ArtistID = tbl_Artist.AristID

第二只手,你需要看到艺术家节目只有1行有2个不同的日期:节目的结束/开始日期在相同的日期范围内结束...我想说:为什么在你的数据库中你的艺术家有许多节目结束日期相交?但我认为这是因为join子句中的错误。尝试使用良好的联接重新运行您的查询。

如果仍然存在,您可以使用MIN()MAX()功能获取艺术家检索到的广告的最大日期范围:

SELECT
    Name
    ,MIN(DateFrom)
    ,MAX(DateTo)
FROM
    (SELECT 
        tbl_Artist.Name
        , tbl_Ad.DateFrom
        , tbl_Ad.DateTo
    FROM 
        tbl_Artist 
        INNER JOIN tbl_Ad 
            ON tbl_Ad.ArtistID = tbl_Artist.AristID
    WHERE 
        DateFrom BETWEEN #12/1/2014# AND #12/10/2014#
        OR DateTo BETWEEN #12/1/2014# AND #12/10/2014#
        OR DateFrom < #12/1/2014# AND DatoTo > #12/10/2014#)
GROUP BY
    Name;