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