Sql查询问题

时间:2009-09-23 04:36:40

标签: oracle

连接表时有问题(左连接) 表1:

id1  amt1
1    100
2    200
3    300

表2:

id2  amt2
1    150
2    250
2    350

我的查询: 从table1中选择id1,amt1,id2,amt2 在table2.id1 = table1.id2

上左连接table2

我认为o / p是:

      id1 amt1  id2 amt2
row1: 1   100   1    150
row2: 2   200   2    250
row3: 2   200   2    350

我希望第3行中的o / p为

2 null 2 350

即我想避免重复数据(amt1) 朋友帮帮忙!

2 个答案:

答案 0 :(得分:1)

选择不同 id1,amt1,id2,amt2来自table1左连接table2 on table2.id1 = table1.id2

试试这个吗?

答案 1 :(得分:1)

使用LEAD和LAG可以访问oracle中的前一行或后续行。

SELECT id1, decode(amt1, lag(amt1) over (order by id1, id2), '', amt1) amt1, 
       id2, amt2 
FROM table1 left join table2 on table2.id1=table1.id2
ORDER BY id1, id2

查询的顺序和给滞后函数的顺序应该相同。

<强>解释
如果当前的am1与前面的amt1相同(在给定的顺序中前面),则省略该值。

修改 根据您的评论,添加额外的ID更改检查。

SELECT id1, 
       decode(id1, lag(id1) over (order by id1, id2), 
           decode(amt1, lag(amt1) over (order by id1, id2), '', amt1), 
           amt1) amt1, 
       id2, amt2 
FROM table1 left join table2 on table2.id1=table1.id2
ORDER BY id1, id2

使用相同的LAG功能检查ID更改。表达式有点复杂,但它与嵌套的if语句相当。