有两列的示例表,我需要将第1列和第2列与同一表记录进行比较,并需要删除第1列+第2列=第2列+第1列。
我尝试进行自我加入和案例条件。但它不起作用
答案 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
清楚吗?