2012-03-25 31 views
0

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

我一直在使用I如果,检查时外键不为空的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语句,以获得正确的连接,结果:

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

回答

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 cascade与Nz函数,当第一个参数是null时返回第二个参数。

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

+0

谢谢你,先生,完美的作品。 – Gybe 2012-03-25 20:45:51

相关问题