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