2014-02-04 5 views
1

У меня есть два набора данных a и b с полями для cusip и тикером. SQL я хотел бы выполнить бы a столбец из набора bif a.cusip=b.cusip, но если я не могу найти матч за Cusip, я хотел бы взять столбец из bif a.ticker=b.ticker.Слияние нескольких корпусов sql

Есть ли простой способ выполнить это? У меня возникли проблемы с конструированием кода за один раз.

+0

Что у вас до сих пор? – Sev09

+0

СДЕЛАЛ НИЖЕ ОТВЕТ ВАШ ВОПРОС @ Райан Льюис – zee

+0

Извините, что оставил всех висящими. Похоже, что все решения действительно, но NullSoul я считаю самым элегантным. Я могу придумать дополнительные возможности для случая, хотя! –

ответ

2

Внутреннее соединение и или в вашем месте Условие условия должно выполнять эту работу.

Select *  from a 
inner join b on a.cusip=b.cusip 
or   a.ticket = b.ticket; 
+0

«Внутренняя регистрация» будет извлекать (только) соответствующие данные из обеих таблиц, а «ИЛИ» будет удовлетворять вашим условиям либо по билетам cusip OR, либо по билетам. – zee

+0

Просто быстро комментируйте это решение: хотя он работает и является элегантным с точки зрения кода, кажется, что он занимает некоторое время на большом наборе данных (12gb.) Мне еще предстоит сравнить это с другими вариантами, но по какой-то причине его немного медленнее, чем делать каждый тикер и запрос cusip отдельно, а затем присоединяться и исключать дубликаты. –

+0

Да. Операции 'OR' очень сложны для оптимизации баз данных, поэтому они, как правило, имеют низкую производительность. Если эффективность важнее, чем читаемость, лучше всего их избегать. –

2

Вам нужно будет присоединиться к вашей таблице B дважды, один раз на cusip и один раз на тикере. Затем вы можете использовать coalesce, чтобы перенести первое ненулевое значение.

select 
coalesce (b_cusip.column, b_ticker.column), 
... 

    from 
    a 
    left outer join b b_cusip 
     on a.cusip = b_cusip.cusip 
    left outer join b b_ticker 
     on a.ticker = b_ticker.ticker 
1

Вы могли бы попробовать что-то вроде этого:

data dataset_a; 
input cusip ticker; 
datalines; 
1 111 
2 222 
3 333 
5 555 
; 
run; 
data dataset_b; 
input cusip ticker value; 
datalines; 
1 111 10 
20 222 25 
30 333 40 
4 444 55 
; 
run; 

proc sql _method; 
create table mydata as 
select 
a.* 
,b.value 
from dataset_a as a 
left join dataset_b as b 
on (case  
     when a.cusip=b.cusip then 1 
     when a.ticker=b.ticker then 1 
     else 0 
    end)=1 
; 
quit; 

возвращается:

cusip ticker value 
1 111 10 
2 222 25 
3 333 40 
5 555 . 
Смежные вопросы