找那些没有写过字母的人

时间:2016-01-28 14:17:30

标签: sql ms-access access-vba

我有三张桌子:tblAreas,描述了英国的各个地区; tblNewsletters,列出我们发布时事通讯的季度日期; tblIssues,这是一个连接前两个的多对多表。 tbl问题描述了每个季度每个区域生成的每份简报(每季度每个区域一份简报)。我想找到那些在某一季度没有制作时事通讯的地区。为了开始,我没有尝试将输出限制到特定的季度,但是甚至无法使其工作。这是我的代码:

SELECT tblArea.ID, tblArea.AreaName
    FROM tblIssues
        WHERE NOT EXISTS
            (SELECT NewsletterLookup
             FROM tblIssues
             WHERE tblIssues.AreaLookup = tblArea.ID);

3 个答案:

答案 0 :(得分:1)

Select * 
from tblArea a
left join tblIssues i on i.AreaId = a.Id
where i.AreaId is null

对于特定季度,您必须使用子查询。

Select * 
from tblArea a
left join (select AreaId 
           from tblIssues ii
           inner join Newsletters n on n.Id = ii.NewsLetterId
           where n.IssueDate = #12/31/2015#
           ) i on i.AreaId = a.Id
where i.AreaId is null

未测试过......

答案 1 :(得分:0)

您需要首先构建所有领域和简报的笛卡尔积,

SELECT a.ID, n.ID FROM tblAreas a, tblNewsletter n

(刚看到访问中没有cross join然后你需要划掉所有确实存在的问题。通常你会使用像

这样的语法

MINUS SELECT i.AreaLookup, i.NewsletterID from tblIssues i

但是MSAccess中不存在这种情况,因此您可以使用NOT IN解决方法,这看起来像

WHERE a.id & "-" & n.ID NOT IN ( SELECT i.AreaLookup & "-" & i.NewsletterID FROM tblIssues i )

答案 2 :(得分:0)

我使用两个查询来提出这个解决方案 - 一个基于另一个。我现在要做的是在一个查询中找到一种方法,可能使用子查询。

SELECT tblIssues.*, tblIssues.NewsletterLookup
FROM tblIssues
WHERE (((tblIssues.NewsletterLookup)=5));

SELECT tblArea.ID, tblArea.AreaName
FROM tblArea LEFT JOIN Query2 ON tblArea.ID = Query2.[AreaLookup]
WHERE (((tblArea.Dormant)=False) AND ((Query2.tblIssues.NewsletterLookup) Is Null));