Sql 选择特定的记录(如果不存在)

Sql 选择特定的记录(如果不存在),sql,ms-access,ms-access-2013,Sql,Ms Access,Ms Access 2013,我有两张桌子: tbl_Artist AristID Name Info 及 一个艺术家可能会为不同的节目制作多个广告。我运行下面的语句,根据广告中的日期选择某个日期范围内的艺术家 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/

我有两张桌子:

tbl_Artist
AristID
Name
Info

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

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#;
其中一场演出的日期比另一场提前一天结束,这使他出现了两次。我想做一个选择,显示2014年12月7日和2014年12月8日的两位艺术家,但仅显示2014年12月10日的一位艺术家


我该如何解决这个问题呢?

首先有件事让我很震惊:从tbl_艺术家内部加入tbl_广告上的tbl_广告。AdID=tbl_广告。ArtistID加入条款应该是tbl_广告。ArtistID=tbl_艺术家。AristID

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

如果这种情况持续存在,您可以使用“最小”和“最大”功能获取艺术家检索广告的最大日期范围:

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;

您在这里很幸运,因为选择了条件,但在混合AND和OR条件时始终使用括号,以使人类读者更清楚。在处理日期和时间类型时,最好使用,否则,在不同的文化中,值可能是不明确的。我们谈论的是十二月,还是十月和一月?。也请避免使用中间,或在所有。感谢您的反馈!我对此还是有点陌生,所以我非常感谢我得到的每一点帮助。也谢谢你包括链接,这样我就可以阅读了。
Artist1   02.12.14 - 10.12.14
Artist2   03.12.13 - 08.12.14
Artist2   03.12.13 - 07.12.14
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;