如下所示,表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。
这里的参考是关系设计:
答案 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
时,它返回第二个参数。
我还对表名使用短别名,从而进一步简化了查询。