我需要一些有关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,但它似乎不支持子查询。
答案 0 :(得分:2)
问题是因为您在Class_A
,Class_B
或Class_C
中有多个具有相同SID的行。考虑一下SID
,Master
和Class_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 )
左外连接允许左表中的记录在右表中没有相应的记录。