2016-07-22 67 views
1

我需要在Microsoft Access 2010上工作一些幫助。我有一種情況,其中我有一個帶有所有ID和英文名稱的主表以及具有另一種語言的ID和名稱的七個子表。需要注意的是,七個子表總和中的條目總數可能與主表不匹配。可能更少。在MS Access 2010中使用Nz()進行有限嵌套?

我試圖創建查詢,顯示ID和要麼名稱在外語,或者如果不存在,然後顯示英文名稱。

最初我想使用COALESCE,但後來我意識到這不是由MS Access支持。

我已經採取了兩種不同的方法 - 首先是一個INNER JOIN:

M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_A A ON M.SID = A.SID 

UNION M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_B B ON M.SID = B.SID 

UNION M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_C C ON M.SID = C.SID 
... 

但我不能捕獲主的所有記錄,不能想辦法選擇不上任何存在的所有記錄A類,B,C等,所以我決定嘗試使用NZ()代替:

SELECT M.SID, 
Nz(
    (SELECT ForeignName FROM Class_A A WHERE M.SID = A.SID), 
    Nz(
    (SELECT ForeignName FROM Class_B B WHERE M.SID = B.SID), 
    Nz(
     (SELECT ForeignName FROM Class_C C WHERE M.SID = C.SID), 
     EnglishName 
    ) 
    ) 
) 

FROM Master M 

它完美,只要我停在B類,但超越導致錯誤:

At most one record can be returned by this subquery.

我也試過使用SWITCH,但它似乎不支持子查詢。

+0

如果您使用您期望的值單獨運行這些查詢,是否有任何查詢返回多個值? 'Nz'只有在返回的'ForeignName'只返回一行或NULL時纔有效。 – Ash

+0

難道你不能只用'IsFull'來嵌套'IIF'嗎?就像@AshwinNair所說的,你在表C中有重複的值,或者Nz採用「C」子選擇並將其添加到「B」。 – Jeroen

回答

2

問題是因爲您在Class_AClass_BClass_C中有多個具有相同SID的行。考慮在Master,Class_AClass_B中有特定SID沒有記錄並且Class_C有2個記錄的情況。在這種情況下,MS Access將如何決定使用這兩個記錄的ForeignName中的哪一個。

運行以下查詢:

select M.SID, count(A.SID) 
from Master M inner join Class_A A on M.SID=A.SID 
group by M.SID having count(A.SID)>1 

然後做同樣在上面的查詢與Class_B然後Class_C替換Class_A。如果三個查詢中的任何一個返回了某些內容,它將指向這三個表中具有相同SID的多個記錄的SID。除非刪除其中一個違規行,否則原始查詢將不起作用。

而且,我會堅持使用加入如下,以使查詢更加高效和可讀性:

SELECT M.SID, 
Nz(A.ForeignName, 
    Nz(B.ForeignName, 
     Nz(C.ForeignName, EnglishName) 
    ) 
) 
FROM (((Master M left outer join Class_A A on M.SID=A.SID) 
left outer join Class_B B on M.SID=B.SID) 
left outer join Class_C C on M.SID=C.SID) 

左外連接允許左表中的記錄不具有相應的記錄右表。

+0

我終於找到了重複的條目感謝您的查詢!起初我以爲沒有任何東西,因爲我在進口時將「SID」字段設置爲主鍵,但似乎我在那個階段搞砸了。我只是想知道,如果LEFT OUTER JOIN是必要的,而不是僅僅使用「FROM MASTER」,因爲Nz已經不覆蓋那個了嗎? –

+0

我很高興它有幫助。無論查詢如何,您都需要這些信息。如果使用內連接而不是左外連接,則查詢將只返回master和class_a共有的行。此外,您的要求也只能回到主,而其他表不會滿足 – Ash