2015-09-30 52 views
1

有2个表格,其数据如下。 “ID”列在两个表中均可用。有人可以帮助我,我怎么得到所需的输出。使用oracle连接2个表格

表1:

ID IND 
101 Y 
102 N 

表2:

ID CD 
101 A 
101 B 
101 C 
101 D 
102 A 

所需的输出:

ID CD IND 
101 A Y 
101 B 
101 C 
101 D 
102 A N 

回答

1

你在这里什么是加入要显示的ind值仅在每个id的第一个cd上。您可以在case表达与row_number()窗函数做到这一点:

SELECT t1.id, t2.cd, CASE rn WHEN 1 THEN t1.ind ELSE NULL END AS ind 
FROM table1 t1 
JOIN (SELECT id, cd, ROW_NUMBER() OVER (PARTITION BY ind ORDER BY cd ASC) AS rn 
     FROM table2) t2 ON t1.id = t2.id 
+0

谢谢。有效 – pavan

0

这应该做的伎俩。

SELECT table1.ID, table2.CD, table1.IND 
FROM table1 
INNER JOIN table2 
ON table1.ID = table2.ID; 
0

我通常会想到,如果你有一个表中的ID列,你会想要做一个简单的内部关系联接:http://sqlfiddle.com/#!4/e8e41/5

select t1.id, t2.cd, t1.ind 
from t1 
inner join t2 
on t2.id = t1.id 

然而,这种方法不会给你指定的结果。您的​​字段将填充每行。

也许你只想加入cd = 'A'。我不知道这点,但你可以做这样的事情:http://sqlfiddle.com/#!4/e8e41/12

select t2.id, t2.cd, coalesce(t1.ind,' ') as ind 
from t2 
left join t1 
on t2.id = t1.id 
and t2.cd = 'A' 
order by id, cd 

或者,也许你正在寻找的ind每个id的第一cd关联。在这种情况下,类似的东西(使用公共表格表达式)可能适用于您:http://sqlfiddle.com/#!4/e8e41/20

with cte as (
    select id, cd, row_number() over (partition by id order by cd) as rn 
    from t2 
) 
select t1.id, cte.cd, case when rn = 1 then t1.ind else ' ' end as ind 
from t1 
inner join cte 
on t1.id = cte.id