2013-08-12 6 views
1

У меня есть две таблицы:Выберите дополнительные условно строки из другой таблицы

TableA 
PK  Alpha Critter Etc 
1  A  zebra  apple 
2  C  lion  orange 
3  R  giraffe banana 
4  D  gopher pear 

TableC 
PK  Alpha Animal Misc 
1  D  beaver kiwi 
2  D  camel  avacado 

мне нужен этот результат:

Result 
PK  Alpha Critter Etc 
22  A  zebra apple 
23  C  lion  orange 
24  R  giraffe banana 
25  D  gopher pear 
26  D  beaver kiwi 
27  D  camel avacado 

Если значение TableA.Alpha составляет более одного TableC.Alpha с то же самое значение по Select будет:

Select TA.Alpha, TA.Critter, TA.Etc 
From TableA TA 

и

Select TC.Alpha, TC.Animal, TC.Misc 
From TableC TC 

на отдельных строках (3 строки в приведенном выше примере)

В противном случае это просто

Select TA.Alpha, TA.Critter, TA.Etc 
From TableA TA 

(одна строка)

я мог бы использовать КТР. Что-то вроде:

With T_CTE (Alpha,CountAlpha) 
AS 
(SELECT 
TC. Alpha, COUNT(TC.Alpha) as CountAlpha 
FROM TableC TC 
GROUP BY TC.Alpha 
HAVING (COUNT(TC.Alpha) > 1)) 

Select TA.Alpha, TA.Critter, TA.Etc 
From TableA TA 
case when T_CTE.Alpha is not null then...else...end 
left join T_CTE on T_CTE.Alpha = TA.Alpha 

ТаблицаA.Aphpha уникальна. TableC.Alpha не уникален.

Могу ли я назвать другой выбор для дополнительных строк? Есть ли лучший подход? Я также думал о создании временных таблиц и выборе их. Это часть более крупного запроса, но сейчас я хочу сосредоточиться на этой части. Любые предложения? Спасибо.

+0

«TableA.Alpha составляет более одного TableC.Alpha» вы имеете в виду для каждого значение ПК? Ваш пример выглядит как 'UNION' –

+0

Я имел в виду для каждого значения PK в TableA. Альфа в TableA уникальна. Alpha не уникален в TableC. Я редактировал. – user2525015

ответ

1

Что-то вроде

;with cte as (
    select A.Alpha, count(*) as cnt 
    from TableA as A 
     inner join TableC as C on C.Alpha = A.Alpha 
    group by A.Alpha 
    having count(*) > 1 
) 
select A.Alpha, A.Critter, A.Etc 
from TableA as A 
union all 
select C.Alpha, C.Animal, C.Misc 
from TableC as C 
where C.Alpha in (select T.Alpha from cte as T) 

sql fiddle demo - Я добавил одну строку TableC, чтобы проверить, если он будет включать в себя это

+0

Спасибо. Это должно сработать. Я должен работать в гораздо большем вопросе. Я отправлю еще один ответ позже. – user2525015

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