Извлечь данные из трех трех таблиц, в зависимости от того, что не равно нулю - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь найти доступные детали адреса из трех таблиц.

Если в таблице 1 есть детали адреса, то получить их из таблицы1

Если адрес таблицы 1 имеет нулевое значение, тогда рассмотрим таблицу2,

Если адрес таблицы 2 имеет нулевое значение, тогда рассмотрим таблицу 3, иначе отобразить адрес таблицы 1 (нулевой)

В таблице 1 есть внешние ключи, которые можно использовать для объединения таблиц 2 и 3, но онитакже может быть нулевым, и в этом случае должны рассматриваться только данные из таблицы 1.

В моем запросе я могу присоединиться к таблицам, когда внешние ключи доступны, но в случае, если они равны нулю, запрос не't work!

Я не уверен, что смогу добавить оператор' Case ', чтобы игнорировать условия' Join 'в случае, если внешние ключи равны нулю.

Может кто-нибудь помочь?

enter image description here

Мой запрос приведен ниже:

SELECT donor.donor_num,

CASE

--WHEN donor.addr1 IS NULL THEN paraddress.addr1

--WHEN paraddress.addr1 IS NULL THEN enrparaddr.addr1

WHEN donor.addr1 IS NULL THEN enrparaddr.addr1

ELSE donor.addr1

END AS Address1,

CASE

--WHEN donor.addr2 IS NULL THEN paraddress.addr2

--WHEN paraddress.addr2 IS NULL THEN enrparaddr.addr2

WHEN donor.addr2 IS NULL THEN enrparaddr.addr2

ELSE donor.addr2

END AS Address2

FROM donor

JOIN enrparaddr ON enrparaddr.par_code = donor.enrol_code

--JOIN paraddress ON paraddress.par_code = donor.par_code

WHERE donor_num = '17206' 

См. Прилагаемое изображение для трех таблиц

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Вы можете сделать это с помощью простого Case. When Statement:

Select Case     
When A.ID is NULL And B.ID is NULL And C.ID is NULL Then -- when all columns contain null
    NULL
When A.ID is NULL And B.ID is NULL Then
    C.ID
When B.ID is NULL and C.ID is NULL Then
    A.ID
When A.ID is NULL And C.ID is NULL Then
    B.ID
End As ID
From A, B, C
0 голосов
/ 25 января 2019
SELECT donor.donor_num,CASE WHEN donor.addr1 IS NULL 
                            THEN enrparaddr.addr1
                            ELSE donor.addr1
                        END AS Address1,
                        CASE WHEN donor.addr2 IS NULL 
                             THEN enrparaddr.addr2
                             ELSE donor.addr2
                        END AS Address2

FROM donor
left join  enrparaddr ON enrparaddr.par_code = donor.enrol_code
WHERE donor_num = '17206' 
0 голосов
/ 25 января 2019

Я бы порекомендовал:

SELECT d.donor_num,
       coalesce(d.addr1, pp.addr1, epe.addr1) AS Address1,
       coalesce(d.addr2, pp.addr2, epe.addr2) AS Address2
FROM donor d LEFT JOIN
     paraddress pp
     ON pp.par_code = d.par_code LEFT JOIN
     enrparaddr epe
     ON epe.par_code = d.enrol_code AND
        pp.par_code IS NULL
WHERE d.donor_num = 17206  -- do not use single quotes for numbers

Примечания:

  • Вы хотите LEFT JOIN, потому что вы хотите, чтобы все строки в donors.
  • Вы должны присоединиться к таблицам в порядке, используемом для COALESCE().
  • Второе условие JOIN может быть ограничено случаями, когда первое не совпадает.
  • Числовые константы не должны использовать одинарные кавычки.
0 голосов
/ 25 января 2019

Вы можете попробовать ниже - используя функцию FULL OUTER JOIN & coalesce()

SELECT donor.donor_num,
       coalesce(donor.addr1,paraddress.addr1,enrparaddr.addr1) AS Address1,
       coalesce(donor.addr2,paraddress.addr2,enrparaddr.addr2) AS Address2
FROM donor
FULL OUTER JOIN enrparaddr ON enrparaddr.par_code = donor.enrol_code
FULL OUTER JOIN paraddress ON paraddress.par_code = donor.par_code
WHERE donor_num = '17206'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...