oracle删除三者的重复组合

fruv7luv  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(534)

我有一个视图返回3列和3个散列。第三列有时为空。
这些组合以不同的顺序重复,例如:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

我想是每3个连接的散列6行。
这些散列实际上是同一个文件的ID(但现在不相关)。

**

我试过各种方法,似乎找到了一个合适的解决办法,但我想知道是否有更好的方法。另外请注意,有时6行中的一行可能会丢失。
我目前正在尝试以下方法,似乎有效:

select one, two, three from DUPLICATE_DOCUMENTS_3JOINS
where (three is null and two<one) or (three<two AND two<one);

有什么想法吗?

wljmcqd8

wljmcqd81#

如果只需要一行,那么想到的最简单的选项是行限制查询:

select d.*
from duplicate_documents_3joins d
order by one, two, three
fetch first row only

在oracle11g及更早版本中,您可以使用 row_number() 取而代之的是:

select one, two, three
from (
    select d.*, row_number() over(order by one, two, three) rn
    from duplicate_documents_3joins d
) d
where rn = 1
dba5bblo

dba5bblo2#

您可以使用独特的选择:

SELECT DISTINCT
    LEAST(one, two, three) AS one,
    CASE WHEN one > two AND one < three
         THEN one
         WHEN LEAST(one, two, three) = one AND two < three
         THEN two
         ELSE three END AS two,
    GREATEST(one, two, three) AS three
FROM yourTable;

给定示例数据集中的六条记录,即1、2和3的六个排列,上面的查询将只返回一条记录1、2、3。上面的逻辑应该适用于一、二、三个值(以任何顺序)的任何集合。

u5i3ibmn

u5i3ibmn3#

如果有三个联接,请修复联接中的问题:

select . . .
from t t1 join
     t t2
     on . . . and t1.one < t2.two join
     t t3
     on . . . and t2.two < t3.three

如果你不得不处理 left join s、 但想法是相似的。

相关问题