PL SQL如何消除表中两列的重复和

时间:2014-05-21 07:03:29

标签: sql oracle

已经有一个类似的问题,但我有几个不同

我有这张表>>

No1 No2  Data       Customer
1   2   01.01.2013  120000
2   1   01.02.2013  100000
3   4   03.06.2011  150000
4   3   05.09.2010  160000
5   6   15.02.2013  110000
6   5   29.06.2014  190000
1   6   19.05.2013  100000
6   1   04.08.2013  120000

9 2 01.07.2011 100000

我想要的是消除具有相同值但在另一个字段中的行。对我来说No1 = 1 No2 = 2而No1 = 2 No2 = 1是一回事。因此,当这种组合出现时,它应该只返回一行。

最后我希望将此作为结果>>

No1 No2  Data      Customer
1   2   01.01.2013  120000
3   4   03.06.2011  150000
5   6   15.02.2013  110000
1   6   19.05.2013  100000

9 2 01.07.2011 100000

我找到了一个解决方案,但仅针对前两列

select distinct least(no1, no2), greatest(no1, no2)
from t

但我需要'数据'和'客户'列也

如果我尝试

select distinct least(no1, no2), greatest(no1, no2), max(Data), max(Customer)
from t

它会给我数据和客户的最大值,但我希望值对应/匹配行..

我的真实表实际上是从包含子查询的大量表中选择的,因此获得结果非常耗时,这就是为什么我想要最简单,最快速的解决方案。

赞赏任何提示/建议

感谢 IV

- 编辑 - / 6小时后/

我忘了提到我有没有组合的单行,就像我刚刚在原始表格中填写的那些(表格中的最后一个:) :)

所以我发现听到了一个帮助我做到这一点的答案

select t1.*  
from MyTable t1  
left outer join MyTable t2 on t1.No1 = t2.No2 and t1.No2 = t2.No1  
where t2.No2 is null   --- this will give me the singles  
    or t1.No1 <= t2.No1  --- and this will give me one row where the combination occures  

非常感谢你们所有人 IV

3 个答案:

答案 0 :(得分:1)

这样的事情应该适用于Oracle。没有要测试的数据库,因此它将包含语法错误。

select * from (
    select least(no1, no2), greatest(no1, no2), Data, Customer,
        rank() over (partition by least(no1, no2), greatest(no1, no2)
            order by Customer desc) r
    from t
) where r = 1

答案 1 :(得分:0)

select *
from the_table
where (no1, no2) in (select distinct least(no1, no2), greatest(no1, no2)
                     from the_table);

如果组合(no1, no2)不是唯一的,则会返回重复项,例如如果有多个行,no1 = 1且no2 = 2

答案 2 :(得分:0)

您可以使用MINUS,这将获得最后一个未耦合的行

SELECT *
FROM   Table1
WHERE (No1, No2) IN (SELECT No1, No2
                     FROM   Table1
                     MINUS
                     SELECT No2, No1
                     FROM   Table1
                     WHERE  No1 < No2);

SQLFiddle demo