2011-02-02 4 views
1

Позволяет сказать, что у меня есть таблица под названием «Компания» с ключом CompanyID . Существует еще одна связанная таблица, называемая «CompanyAddress», которая имеет внешний ключ CompanyID, поэтому соединение может быть легко установлено.Условный запрос DB2 SQL

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

Джойна и т.д., чтобы получить поля тривиальны, однако я хочу условный, где я запросить адреса и использовать AddressType = 1, если оно есть, если это не так, используйте AddressType = 2

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

ответ

2

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

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; 
+0

+1 это будет работать с DB2 для IBM я V5R4, а также –

2

Союзная и не существует теста, похоже на способ сделать это

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 

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

Смежные вопросы