我有一个SQL数据库表ABC,我有两列,即column1和column2。
在这张表中,我有一些数据,如。
column1 column2
-------------------
1 2
1 7
2 1
3 4
7 1
4 3
现在,我必须删除此表中彼此交叉链接的数据。例如。
(1,2) are cross linked to (2,1)
(1,7) are cross linked to (7,1)
(3,4) are cross linked to (4,3)
所以,我需要从这对中删除一个值。我的最终输出应该是:
column1 column2
-------------------
1 2
1 7
3 4
OR
column1 column2
-------------------
2 1
4 3
7 1
我想编写一个sql查询来执行此操作。任何人都知道我怎么能实现这个目标?
答案 0 :(得分:3)
试试这个: SQLFIDDLE
with pairs as (select
case when c1< c2 then c1 else c2 end as minc,
case when c1< c2 then c2 else c1 end as maxc
from t
group by
case when c1< c2 then c1 else c2 end ,
case when c1< c2 then c2 else c1 end
having count(*) >1)
select *
from t
where not exists
(select * from pairs
where c1= minc and c2= maxc
)
通过NOT EXISTS
,它会返回所有未配对的行
如果您将where c1= minc and c2= maxc
的条件更改为where c2= minc and c1= maxc
,则会获得对的相反方。
如果您想删除这些对的一侧,请DELETE FROM T WHERE EXISTS
代替NOT EXISTS
有一些不同的方法可以获得成对的行。
答案 1 :(得分:0)
SELECT A.* FROM test A LEFT JOIN test B
ON A.column1 = B.column2 AND A.column2 = B.column
WHERE B.column IS NULL;
这应该有效,假设您的确定等(2,2)也被排除在外。