SELECT Query仅填充包含外键的三个字段之一

时间:2012-03-25 18:17:27

标签: ms-access iif

如下所示,表Recording包含三个外键,其中只有一个将填入任何一个条目。我的问题是如何在Access中格式化一个select语句,它只会在给定该表的外键的情况下从相关表中提取名称?

我尝试过使用IIf,它在SELECT:

之后检查哪个外键不为空时有效
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语句之后放置任何条件以获得正确的JOIN会导致错误:

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

我是新手,所以我可能会错过一些明显的东西,或者说错误的方式。我相信我最终得到的是一个独家弧?我不确定这是否是一个好的设计,我曾想过要删除录音表,只需将外键添加到Track。

这里的参考是关系设计:

ER

1 个答案:

答案 0 :(得分:3)

您可以使用LEFT JOIN解决问题

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

它们返回左侧表格中的所有记录,并且只返回符合连接条件的右侧表格中的记录。

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

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