0

如下表所示,该表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]));

我是新手,所以我可能遗漏了一些明显的东西,或者以错误的方式处理它。我相信我在这里最终得到的是独家弧线?我不确定这是否是一个好的设计,我曾想过废弃 Recording 表并简单地将外键添加到 Track。

这里的参考是关系设计:

急诊室

4

1 回答 1

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.

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

于 2012-03-25T20:08:22.523 回答