Возвращает фиктивное значение, если для предложения IN нет строки - PullRequest
0 голосов
/ 27 апреля 2018

Я использую DB2, и у меня возникает ситуация, когда я хочу вернуть фиктивные значения, если в БД нет строки для идентификаторов, присутствующих в пункте IN

SELECT A.EmpName, A.EmpId,B.Address, C.OrgCode
FROM Employee A
    join Address B on A.EmpId = B.EmpId 
    join Organization C on A.EmpId = C.EmpId
where A.SecretId in ('1', '2', '3', '4', '5');

У меня есть сотрудник с секретным идентификатором 1,2,3,4 в базе данных, но не 5, но мне нужен следующий результат, как показано ниже

EmpId   EmpName Address OrgCode
  1        A      XXX     23
  2        B      YYY     44
  3        C      ZZZZ    21
  4        D      KKK     23
  5       N/A     N/A     N/A

Мне нужно заполнить значения некоторыми фиктивными значениями. Я получаю список секретных идентификаторов из какой-то другой системы.

Пожалуйста, помогите мне достичь этого.

Я использую DB2 в качестве базы данных.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Вам нужно left join и начать с значений, которых у вас нет:

SELECT e.EmpName, el.EmpId, a.Address, o.OrgCode
FROM (SELECT 1 as EmpId FROM sysibm.sysdummy1 UNION ALL
      SELECT 2 as EmpId FROM sysibm.sysdummy1 UNION ALL
      SELECT 3 as EmpId FROM sysibm.sysdummy1 UNION ALL
      SELECT 4 as EmpId FROM sysibm.sysdummy1 UNION ALL
      SELECT 5 as EmpId FROM sysibm.sysdummy1
     ) el LEFT JOIN
     Employee e
     ON el.EmpId = e.EmpId LEFT JOIN
     Address a 
     ON el.EmpId = a.EmpId LEFT JOIN
     Organization o
     ON el.EmpId = o.EmpId ;

Или используйте удобный ярлык:

SELECT e.EmpName, el.EmpId, a.Address, o.OrgCode
FROM (VALUES (1), (2), (3), (4), (5)) el(EmpId)
     Employee e
     ON el.EmpId = e.EmpId LEFT JOIN
     Address a 
     ON el.EmpId = a.EmpId LEFT JOIN
     Organization o
     ON el.EmpId = o.EmpId ;
0 голосов
/ 27 апреля 2018

С обновлением это все еще левое соединение:

SELECT t.EmpId, NVL(A.EmpName, 'N/A'), NVL(B.Address, 'N/A'), 
       NVL(C.OrgCode, 'N/A')
FROM TABLE(VALUES ('1'), ('2'), ('3'), ('4'), ('5')) AS t(empid)
    LEFT OUTER JOIN Employee A
        ON t.empid = A.empid
    LEFT OUTER JOIN Address B 
        ON t.EmpId = B.EmpId 
    LEFT OUTER JOIN Organization C 
        ON t.EmpId = C.EmpId
;

Как примечание, помещая числа в кавычки, вы превращаете их в строку. Если EmpId - строка, это хорошо, но если это число, то оно менее эффективно.

0 голосов
/ 27 апреля 2018

Просто попробуйте использовать LEFT JOIN вместо:

SELECT A.EmpName, A.EmpId,B.Address, C.OrgCode
FROM Employee A
    left join Address B on A.EmpId = B.EmpId 
    left join Organization C on A.EmpId = C.EmpId
where A.EmpId in ('1', '2', '3', '4', '5');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...