在MS Access 2010中使用Nz()进行有限嵌套?

时间:2016-07-22 03:58:00

标签: sql ms-access ms-access-2010

我需要一些有关Microsoft Access 2010的帮助。我遇到的情况是,我有一个包含所有ID和英文名称的主表以及七个带有ID的子表和用其他语言命名。需要注意的是,七个子表总和中的条目总数可能与主表不匹配。它可能更少。

我尝试创建显示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
...

但是我无法捕获Master上的所有记录,也无法想出选择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级,它就能完美运行,但超越会导致错误:

  

此子查询最多可以返回一条记录。

我也试过使用SWITCH,但它似乎不支持子查询。

1 个答案:

答案 0 :(得分:2)

问题是因为您在Class_AClass_BClass_C中有多个具有相同SID的行。考虑一下SIDMasterClass_A中的特定Class_B没有记录而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_A然后Class_B替换上述查询中的Class_C。如果三个查询中的任何一个返回某些内容,则它指向具有相同SID的多个记录的这3个表中的任何一个中的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 )

左外连接允许左表中的记录在右表中没有相应的记录。