2015-06-05 3 views
2

Извините, я новичок в SQL. Терминология помогает улучшить мое название вопроса/дальнейший поиск в Google. Я уверен, что мой вопрос задан, но я не мог понять, что искать.Частично Циркуляр Присоединиться

Проблема:

  • Я выборе кучу данных (несколько столбцов) из таблицы А, в том числе главного значения, Claim_Nbr.
  • Я являюсь внутренним соединением таблицы B на A.Claim_Nbr = B.Claim_Nbr.
  • Таблица B имеет значение P_Claim_Nbr, то есть также Claim_Nbr, и я хотел бы получить все столбцы таблицы A (Column_2, Column_3 и т. Д.) Для B.P_Claim_Nbr s как часть моего набора результатов.

Примечания:

  • Только некоторые Claim_Nbr s имеют P_Claim_Nbr s.
  • Нет P_Claim_Nbr имеют свои собственные P_Claim_Nbr s.
  • Все P_Claim_Nbr имеют свои собственные Column_2 s и Column_3 s.

  • У меня нет разрешения на создание temp_tables

То, что я так далеко, что не сломано (получает 70% там):

select distinct A.Claim_Nbr, A.Column_2, A.Column_3, B.P_Claim_Nbr 
from Table_A A 
join Table_B B 
on A.Claim_Nbr = B.Claim_Nbr 

результаты я имеют теперь:

------------------------------------------------- 
| Claim_Nbr | Column_2 | Column_3 | P_Claim_Nbr | 
|  1A | data1 | data2 |  1B  | 
|  2A | data3 | data4 |  null | 
------------------------------------------------- 

То, что я пытаюсь получить:

------------------------------------------------- 
| Claim_Nbr | Column_2 | Column_3 | P_Claim_Nbr | 
|  1A | data1 | data2 |  1B  | 
|  2A | data3 | data4 |  null | 
|  1B | data5 | data6 |  null | 
------------------------------------------------- 

Я буду продолжать пытаться разными присоединяется, чтобы сделать эту работу, но поможет приему.

+0

Какие типы соединений вы пробовали? – BrianAtkins

+0

Два, которые я пробовал: 1. В запросе прямо ниже того, что у меня есть, «присоедините Table_A c к B.P_Claim_Nbr = C.Claim_Nbr', а затем переключитесь на все As как в Cs 2. Изменение' join Table_B B' to 'left join Table_B B' – puzzlepiece87

ответ

1

Если я понимаю вопрос, которого я не могу, я думаю, вы можете попасть туда с UNION.

--you orginal rs 
SELECT A.Claim_Nbr, A.Column_2, A.Column_3, B.P_Claim_Nbr 
    FROM Table_A A 
    JOIN Table_B B ON A.Claim_Nbr = B.Claim_Nbr 

UNION --get only distinct values from the combined result sets 

--plus all the records form the next level deep. 
SELECT A2.Claim_Nbr, A2.Column_2, A2.Column_3, NULL 
    FROM Table_A A 
    JOIN Table_B B on A.Claim_Nbr = B.Claim_Nbr 
    JOIN TABLE_A A2 ON B.P_Claim_Nbr = A2.Claim_Nbr 
+0

Большое спасибо! Это помогло мне решить проблему, когда, если бы я присоединился к таблице A c, а затем заменил все A.s на C.s, ни один из результатов A (претензии 1A и 2A) не появится, только C.s (1B). Спасибо! – puzzlepiece87

+0

Любые предложения о том, что переименовать вопрос? – puzzlepiece87

+1

Это скорее круговое соединение, чем рекурсивное соединение. Я мог бы назвать его «Частично циркулярным соединением» и не беспокоиться об этом. –

0
declare @tableA table(Claim_Nbr varchar(2)) 

insert into @tableA 
select '1A' union all 
select '2A' 

declare @tableB table(Claim_Nbr varchar(2), Column_2 varchar(max), Column_3 varchar(max), P_Claim_Nbr varchar(2)) 

insert into @tableB(Claim_Nbr, Column_2,Column_3, P_Claim_Nbr) 
select '1A', 'data1', 'data2', '1B' union all 
select '2A', 'data3', 'data4', null union all 
select '1B', 'data5', 'data6', null 


;with cte as 
(
    select b.* 
    from @tableA a 
     join @tableB b on a.Claim_Nbr = b.Claim_Nbr 
    union all 
    select b.* 
    from cte c 
     join @tableB b on b.Claim_Nbr = c.P_Claim_Nbr 
) 
select * from cte 
+0

А, спасибо. Есть несколько проблем с этим. 1. У меня нет прав на создание временных таблиц. (Я добавил примечание выше, спасибо). 2. Это потребовало бы от меня скорейшей силы собирать все данные самостоятельно и самостоятельно настраивать таблицы. Это технически достигает того, что я просил, но выше это упрощенная версия того, что я на самом деле делаю, и я пытаюсь сохранить еще несколько взаимосвязей между данными, которые этот метод будет исключать. Спасибо, что пытались. – puzzlepiece87

+1

Таблицы temp (как правило, это переменные таблицы), вероятно, предназначены только для настройки некоторых выборочных данных, чтобы показать, что решение работает. –

+1

Нет необходимости в создании временных таблиц, просто используйте код, начинающийся с: cte as и замените tableA на Table_A и tableB на Table_B – Oleg

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