Ms access 选择仅填写包含外键的三个字段之一的查询

Ms access 选择仅填写包含外键的三个字段之一的查询,ms-access,iif,Ms Access,Iif,如下图所示,表记录包含三个外键,对于任何一个条目,只会填充其中一个外键。我的问题是如何在Access中设置select语句的格式,该语句只会在给定表的外键的情况下从相关表中提取名称 我尝试过使用IIf,当在选择后检查哪个外键不为空时,它会起作用: SELECT Recording.[idRecording], IIf(Recording.[Artist_idArtist] Is Not Null, Artist.[artName] ,

如下图所示,表
记录
包含三个外键,对于任何一个条目,只会填充其中一个外键。我的问题是如何在Access中设置select语句的格式,该语句只会在给定表的外键的情况下从相关表中提取名称

我尝试过使用IIf,当在选择后检查哪个外键不为空时,它会起作用:

SELECT Recording.[idRecording],
       IIf(Recording.[Artist_idArtist] Is Not Null,  
             Artist.[artName] , 
                 IIf(Recording.[Band_idBand] is Not Null, 
                      Band.[bName], 
                        Composer.[cName]))
FROM ...
但是在FROM语句之后放置任何条件以获得正确的联接,都会导致错误:

FROM 
   IIf(Recording.[Artist_idArtist] Is Not Null, 
         Artist INNER JOIN Recording ON Recording.[Artist_idArtist] = Artist.[idArtist],
            IIf(Recording.Band_idBand Is Not Null,
                  Band INNER JOIN Recording ON Recording.[Band_idBand] = Band.[idBand],
                    Composer INNER JOIN Recording ON Recording.[Composer_idComposer] = Composer.[idComposer]));
我是新手,所以我可能错过了一些明显的东西,或者走错了方向。我相信我在这里得到的是一个独特的弧线?我不确定这是否是一个好的设计,我曾想过废弃录音表,简单地将外键添加到曲目中

以下是关系设计供参考:


使用左联接可以解决此问题

SELECT
    R.idRecording,
    Nz(A.artName, Nz(B.bName, C.cName))
FROM
    ((Recording R
    LEFT JOIN Artist A
        ON R.Artist_idArtist = A.idArtist)
    LEFT JOIN Band B
        ON R.Band_idBand = B.idBand)
    LEFT JOIN Composer C
        ON R.Composer_idComposer = C.idComposer
它们返回左侧表中的所有记录,仅返回右侧表中满足联接条件的记录

我还使用
Nz
函数简化了
IIf
级联,该函数在第一个参数为
null
时返回第二个参数


我还为表名使用了短别名,从而进一步简化了查询。

您可以用左连接解决这个问题

SELECT
    R.idRecording,
    Nz(A.artName, Nz(B.bName, C.cName))
FROM
    ((Recording R
    LEFT JOIN Artist A
        ON R.Artist_idArtist = A.idArtist)
    LEFT JOIN Band B
        ON R.Band_idBand = B.idBand)
    LEFT JOIN Composer C
        ON R.Composer_idComposer = C.idComposer
它们返回左侧表中的所有记录,仅返回右侧表中满足联接条件的记录

我还使用
Nz
函数简化了
IIf
级联,该函数在第一个参数为
null
时返回第二个参数

我还为表名使用了短别名,从而进一步简化了查询