Почему FULL JOIN действует как LEFT JOIN в SQL - PullRequest
0 голосов
/ 12 февраля 2020

Моя проблема связана с попыткой объединения таблиц, которые не имеют первичных ключей с полным объединением. Мне нужно сгенерировать таблицу, в которую будут включены КОМПАНИЯ и Год программы, но участнику не нужно участвовать в обоих мероприятиях, только в одном из двух. Таблицы PHA и BIO содержат несколько записей для каждого пользователя, поскольку они участвуют в течение нескольких лет. Когда я соединяю одну из таблиц PHA или BIO с таблицей регистрации (RL), а затем пытаюсь выполнить полное соединение с оставшейся таблицей, это по существу действует как левое соединение.

То, что я ищу, обрисовано в общих чертах в простой пример Excel прилагается. Для каждой компании участие в любом из этих мероприятий может варьироваться (так как в BIO может быть более активное участие один год, но PHA может быть следующим).

Simple example of data and desired output

Ниже приведен пример того, с чем я экспериментировал:

SELECT
    RL.UserName
    ,RL.Company
    ,BIO.ScreeningDate
    ,BIO.ProgramYear
    ,PHA.PHADate
    ,PHA.ProgramYear            

FROM    Registration RL 
        LEFT OUTER JOIN PHADetails PHA
            on RL.UserName = PHA.Username
        FULL OUTER JOIN Biometrics BIO
            on RL.UserName = BIO.Username 
                AND BIO.ProgramYear = PHA.ProgramYear

--FROM  Registration RL 
--      LEFT OUTER JOIN Biometrics BIO
--          on RL.UserName = BIO.Username
--      FULL OUTER JOIN PHADetails PHA
--          on RL.UserName = PHA.Username 
--              AND BIO.ProgramYear = PHA.ProgramYear

WHERE RL.Company = 'City' 
        and CASE WHEN BIO.ProgramYear = 2019 and PHA.ProgramYear = 2019 THEN 1
            WHEN BIO.ProgramYear = 2019 AND PHA.ProgramYear IS NULL THEN 1
            WHEN BIO.ProgramYear IS NULL AND PHA.ProgramYear = 2019 THEN 1 
            ELSE 0 END > 0

-- have 27 participants in biometrics program
-- have 37 particiapnts in PHA program
-- want to always include participants who did both or either one, but
--   the participation for either one will vary
-- need to combined the two left joins shown above into the same full join

1 Ответ

1 голос
/ 12 февраля 2020

Несмотря на ситуацию с предложением WHERE, ваш текущий запрос может также привести к нежелательным результатам, если записи, которые появляются в одной таблице, не совпадают по году записи в другой таблице. Следовательно, строки с NULL могут быть возвращены, когда предположительно должны быть значения. По этой причине рассмотрите возможность объединения только на UserName, а затем на DISTINCT и COALESCE, чтобы уменьшить и объединить годы.

SELECT DISTINCT
    RL.UserName
    ,RL.Company
    ,COALESCE(BIO.ProgramYear, PHA.ProgramYear) AS ProgramYear
    ,BIO.ScreeningDate
    ,PHA.PHADate

FROM    Registration RL 
        LEFT OUTER JOIN PHADetails PHA
            on RL.UserName = PHA.Username
        FULL OUTER JOIN Biometrics BIO
            on RL.UserName = BIO.Username 
...

Чтобы использовать данные Excel, см. Онлайн-демонстрация ,

SELECT DISTINCT
     RL.UserName
    ,RL.Firstname
    ,RL.Lastname
    ,COALESCE(BIO.Year, PHA.Year) As Year
    ,BIO.One    
    ,PHA.Four


FROM    UserTable RL 
        LEFT OUTER JOIN AddInfoTable PHA
            ON RL.UserName = PHA.Username
        FULL OUTER JOIN BaseInfoTable BIO
            ON RL.UserName = BIO.Username
ORDER BY 
    COALESCE(BIO.Year, PHA.Year) DESC;

SQL Output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...