将两列与同一张表进行比较以删除重复项

时间:2019-05-29 09:26:09

标签: sql informatica

有两列的示例表,我需要将第1列和第2列与同一表记录进行比较,并需要删除第1列+第2列=第2列+第1列。

我尝试进行自我加入和案例条件。但它不起作用

5 个答案:

答案 0 :(得分:1)

您可以使用 except 运算符。

  

EXCEPT从左输入查询返回不由右输入查询输出的不同行。

SELECT C1, C2 FROM table
Except
SELECT C2, C1 FROM table

具有给定数据集的示例: dbfiddle

答案 1 :(得分:1)

如果我理解正确,那么如果表中有所有反向对,则可以运行像这样的简单select

select col1, col2
from t
where col1 < col2;

如果您有一些单身人士,那么:

select col1, col2
from t
where col1 < col2 or
      (col1 > col2 and
       not exists (select 1
                   from t t2
                   where t2.col1 = t.col2 and
                         t2.col2 = t.col1
                  )
      );

答案 2 :(得分:0)

我基于oracle数据库发布答案,并且列为字符串/ varchar:

从表中的rowid中删除( 从表中选择rowid 其中column1 || column2 =第2列|| column1)

随时提供更多输入,我们可以调整答案。

答案 3 :(得分:-1)

好的。这样做可能有更简单的方法,但这也可能起作用。 {table}将替换为您的表名。

;with orderedtable as (select t1.col1, t1.col2, ROW_NUMBER() OVER(ORDER BY t1.col1, t1.col2 ASC) AS rownum
from (select distinct t2.col1, t2.col2 from {table} t2) as t1)

select f1.col1, f1.col2
from orderedtable f1
left join orderedtable f2 on f1.col1 = f2.col2 and f1.col2 = f2.col1 and f1.rownum < f2.rownum
where f2.rownum is null

答案 4 :(得分:-2)

下面的SQL将获得反转的col1和col2行:

select
    distinct t2.col1,t1.col2
from
    table t1
join
    table t2 on t1.col1 = t2.col2 and t1.col2 = t2.col1

当我们得到这些反向行时,我们可以使用left join子句将它们除外,完整的SQL是:

select
    t.col1,t.col2
from
    table t
left join
    (
      select
        distinct t2.col1,t1.col2
      from
        table t1
      join
        table t2 on t1.col1 = t2.col2 and t1.col2 = t2.col1
    ) tmp on t.col1 = tmp.col1 and t.col2 = tmp.col2
where
    tmp.col1 is null

清楚吗?