Условный запрос SQL DB2 - PullRequest
       2

Условный запрос SQL DB2

1 голос
/ 03 февраля 2011

Допустим, у меня есть таблица с названием "Company", с ключом CompanyID Существует еще одна связанная таблица с именем «CompanyAddress», которая имеет внешний ключ CompanyID, поэтому соединение можно легко установить.

Эта таблица CompanyAddress может иметь несколько адресов для данной компании, например AddressType = 1 или AddressType = 2

Соединение и т.д. для получения полей тривиально, однако я хочу условное, где я запрашиваю адреса и использую AddressType = 1, если он есть, если нет, используйте AddressType = 2

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

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Это довольно тривиально (если вы используете DB2 для Linux / UNIX / Windows) с использованием функций OLAP.Я угадал некоторые имена столбцов в таблице companyAddress, но «магия» заключается в функции rank ():

with preferredAddresses as (
   select 
      companyID, 
      address, 
      addresstype, 
      rank() over (partition by companyID order by addresstype ) as rank 
   from 
      companyAddress
)
select * 
from 
   company C,
   inner join preferredAddresses A
      on c.companyID = A.companyID
where
   A.rank = 1;
2 голосов
/ 03 февраля 2011

Тест объединения и несуществования кажется подходящим для этого

select *
from company C
inner join CompanyAddress A on A.companyID = C.companyID
where A.AddressType = 1
union all
select *
from company C
LEFT join CompanyAddress A on A.companyID = C.companyID
  and A.AddressType = 2
  and not exists (
    select *
    from CompanyAddress B
    where B.companyID = C.companyID
      and B.AddressType = 1)

Во 2-й части используется левое соединение, так что компании, у которых нет ни типа адреса 1, ни 2, все равно будут отображаться.
Либо так, либо используйте левое соединение с AddressType = 2, которое срабатывает только при сбое первого соединения (тип = 1).

select C.*,
    coalesce(A.addressType, B.addressType) addressType,
    coalesce(A.streetname, B.streetname) streetname
from company C
left join CompanyAddress A on A.companyID = C.companyID and A.AddressType = 1
left join CompanyAddress B on A.companyID is null
    AND B.companyID = C.companyID and B.AddressType = 2

Как видите, это сложнее, поскольку каждый столбец из Address имеетпройти через coalesce между А и В.

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