2016-01-28 59 views
0

我有三個表:tblAreas,其中描述了英國的各個領域; tblNewsletters,它列出了我們發佈時事通訊時的季度日期; tblIssues,它是連接前兩者的多對多表。 tbl問題描述每個季度每個區域生成的每個時事通訊(每季度每個區域一期通訊)。我想找到那些在特定季度沒有製作簡報的領域。爲了開始,我沒有試圖限制輸出到特定的季度,但甚至無法讓它工作。這裏是我的代碼:找到那些誰沒有寫信

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

對於初學者來說,你在你的'SELECT'和子查詢中引用'tlbArea'表(或別名)不在你的'FROM'子句中。除此之外,我沒有看到明顯的語法問題。你的意思是'從tblArea'而不是? –

+0

該地區不會描述通訊。使用你的評論我嘗試了以下,但它只是提示一個新的記錄。 (按ENTER鍵不僅節省了我的意見 - 不能縮進以下):SELECT tblArea.ID,tblArea.AreaName FROM tblIssues INNER JOIN tblArea ON tblIssues.AreaLookup = tblArea.ID WHERE NOT EXISTS (SELECT NewsletterLookup FROM tblIssues INNER JOIN tblArea ON tblIssues.AreaLookup = tblArea.ID WHERE tblIssues.AreaLookup = tblArea.ID); –

+1

請不要在評論中張貼超過幾個字的SQL或代碼。 **編輯**你的問題,並將其添加到那裏。 – Andre

回答

0
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 

不tested..sorry

+0

謝謝。我不明白'tblArea a''tblIssues我'i.AreaId' –

+1

這些是'ALIAS'es.You也可以從'tblArea'寫成''。 Google for'sql別名'。我沉迷於這些。你爲一個表名創建一個*同義詞*。使您的編碼更加簡潔和可讀(IMO),並且允許您通過在別名之前更改名稱來快速定位另一個表。 –

+0

有沒有你寫'AreaId'而不是'Area.Id'的原因? –

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)

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));