部分循环加入

时间:2015-06-05 21:02:04

标签: sql oracle

抱歉,我是SQL的新手。术语帮助改善我的问题标题/进一步谷歌搜索欢迎。我确定我的问题已被提出,但我无法弄清楚要搜索的内容。

问题:

  • 我从表A中选择了一堆数据(几列), 包括一个主要值,Claim_Nbr。
  • 我在A.Claim_Nbr = B.Claim_Nbr上加入表B.
  • 表B有一个值P_Claim_Nbr,它也是一个Claim_Nbr,我想得到B.P_Claim_Nbr的所有表A列(Column_2,Column_3等)作为我的结果集的一部分。< / LI>

备注:

  • 只有一些Claim_Nbr具有P_Claim_Nbr s。
  • 没有P_Claim_Nbr拥有自己的P_Claim_Nbr s。
  • 所有P_Claim_Nbr都有自己的Column_2和Column_3。

  • 我无权创建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    |
-------------------------------------------------

我将继续尝试不同的联接来完成这项工作,但欢迎帮助。

2 个答案:

答案 0 :(得分: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

答案 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