使用oracle加入2个表

时间:2015-09-30 18:58:30

标签: sql oracle select join oracle11g

有2个表格,数据如下。列' ID'在两个表中都可用。有人可以帮助我如何获得所需的输出。

表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 

3 个答案:

答案 0 :(得分:1)

您在此处所拥有的是一个联接,您希望仅在每个ind的第一个cd上显示id的值。您可以使用row_number()表达式中的case窗口函数执行此操作:

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

答案 1 :(得分:0)

这应该可以解决问题。

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

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

但是,这不会给你指定的结果。您的每个行都会填充IND字段。

也许你只想加入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与每个cd的第一个id相关联。在这种情况下,这样的事情(使用公用表表达式)可能适合您: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