0

以下に示すように、表Recordingには3つの外部キーが含まれており、1つのエントリに対して1つだけが入力されます。私の質問は、Accessでselectステートメントをフォーマットして、そのテーブルの外部キーを指定して、関連するテーブルからのみ名前を取得する方法を教えてください。

SELECTの後でどの外部キーがNullでないかをチェックするときに機能する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 ...

ただし、正しいJOINを取得するために、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]));

私はこれに慣れていないので、おそらく明らかな何かを見逃しているか、間違った方法でそれを行っています。私がここで終わったのは排他的なアークだと思いますか?これが良いデザインであるかどうかはわかりません。Recordingテーブルを破棄して、Trackに外部キーを追加することを考えていました。

参考までに、リレーションシップデザインを示します。

ER

4

1 に答える 1

3

LEFTJOINを使用して問題を解決できます

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

左側のテーブルからすべてのレコードを返し、右側のテーブルから結合条件が満たされたレコードのみを返します。

また、最初の引数が。の場合に2番目の引数を返す関数を使用してIIfカスケードを簡略化しました。Nznull

また、テーブル名に短いエイリアスを使用しているため、クエリがさらに簡素化されます。

于 2012-03-25T20:08:22.523 に答える