Объединять таблицы, только если первое объединение не дает результатов - PullRequest
0 голосов
/ 10 января 2020

У меня есть 5 таблиц A, B, C, D, E.

Первичным ключом A является внешний ключ в B, C, D, E. Их нет их собственный первичный ключ.

Я должен реализовать определенную логику c, где

if ("A JOIN B JOIN C" IS NOT NULL)
    return result of "A JOIN B JOIN C"
else if ("A JOIN C" IS NOT NULL)
    return result of "A JOIN C"
else if ("A JOIN D" IS NOT NULL)
    return result of "A JOIN D"
else if ("A JOIN E" IS NOT NULL)
    return result of "A JOIN E"
else return A

where A.primarykey = <some value>

Я должен реализовать это в одном sql, а не в сохраненном про c , Я не могу придумать, как этого добиться. Я использую DB2. Буду очень признателен, если вы дадите несколько указаний о том, как действовать.

Ответы [ 3 ]

1 голос
/ 10 января 2020

Попробуйте следующее. Вы можете редактировать входные данные, чтобы проверить результат.

WITH 
  A (ID, AV) AS (VALUES (1, 'A1'))
, B (ID, BV) AS (VALUES 
(1, 'B1'), (1, 'B2')
--(2, 'B1'), (2, 'B2')
) , C (ID, CV) AS (VALUES 
(1, 'C1'), (1, 'C2'), (1, 'C3')
--(2, 'C1'), (2, 'C2'), (2, 'C3')
), D (ID, DV) AS (VALUES 
(1, 'D1'), (1, 'D2')
--(2, 'D1'), (2, 'D2')
) , E (ID, EV) AS (VALUES 
(1, 'E1'), (1, 'E2'), (1, 'E3')
--(2, 'E1'), (2, 'E2'), (2, 'E3')
)
SELECT A.ID, A.AV, B.BV, C.CV, C1.CV AS CV1, D.DV, E.EV
, 
CASE
  WHEN B.ID  IS NOT NULL THEN 'A+B+C'
  WHEN C1.ID IS NOT NULL THEN 'A+C'
  WHEN D.ID  IS NOT NULL THEN 'A+D'
  WHEN E.ID  IS NOT NULL THEN 'A+E'
  ELSE 'A'
END JOIN_PATH
FROM A
LEFT JOIN 
(
B 
JOIN C ON C.ID=B.ID
)              ON B.ID  = A.ID 
LEFT JOIN C C1 ON C1.ID = A.ID AND B.ID IS NULL
LEFT JOIN D    ON D.ID  = A.ID AND B.ID IS NULL AND C1.ID IS NULL 
LEFT JOIN E    ON E.ID  = A.ID AND B.ID IS NULL AND C1.ID IS NULL AND D.ID IS NULL;
1 голос
/ 10 января 2020

Вы можете сделать что-то вроде этого:

select
  case 
     when B.key is not null and C.key is not null then 'A+B+C'
     when C.key is not null then 'A+C'
     when D.key is not null then 'A+D'
     when E.key is not null then 'A+E'
  end
from A
left join B on B.key = A.key
left join C on C.key = A.key
left join D on D.key = A.key
left join E on E.key = A.key
left join F on F.key = A.key

Оператор case прекратит выполнять оценку, как только будет выполнено условие when, поэтому вы получите блок if-else if .

Я просто возвращаю строковые значения в примере, но вы также можете возвращать значения полей, в зависимости от ваших потребностей, например:

  case 
     when B.key is not null and C.key is not null then b.f1
     when C.key is not null then c.f1
     when D.key is not null then d.f1
     when E.key is not null then e.f1
  end as 'f1'
  ,
  case 
     when B.key is not null and C.key is not null then b.f2
     when C.key is not null then c.f2
     when D.key is not null then d.f2
     when E.key is not null then e.f2
  end as 'f2'
0 голосов
/ 10 января 2020

Вы хотите LEFT JOIN s с некоторыми дополнительными логами c для обработки «остальной» части того, что вы делаете:

select . . .
from A left join
     B 
     on B.key = A.key left join
     C
     on C.key = A.key left join
     C c2
     on c2.key = A.key and
        c.key is null left join  -- first attempt failed
     D
     on D.key = A.key and
        c.key is null and
        c2.key is null left join  -- earlier joins failed
     E
     on e.key = A.key and
        c.key is null and
        c2.key is null and
        d.key is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...