SELECT Query, где заполнено только одно из трех полей, содержащих внешние ключи - PullRequest
0 голосов
/ 25 марта 2012

Как показано ниже в таблице Recording содержит три внешних ключа, только один из которых будет заполнен для любой одной записи.Мой вопрос заключается в том, как я могу отформатировать оператор выбора в Access, который будет извлекать только имена из соответствующей таблицы с учетом внешнего ключа для этой таблицы?

Я пытался использовать IIf, который работает при проверке, какой внешний ключ являетсяНе Null после 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 Ответ

3 голосов
/ 26 марта 2012

Вы можете решить проблему с ЛЕВЫМИ СОЕДИНЕНИЯМИ

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.

Я также использую короткие псевдонимы для имен таблиц, что еще больше упрощает запрос.

...