用于删除/标识表中的交叉链接数据的SQL查询

时间:2014-09-02 07:34:09

标签: sql tsql

我有一个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查询来执行此操作。任何人都知道我怎么能实现这个目标?

2 个答案:

答案 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
)

解释

  • CTE表返回一侧的所有配对行。
  • 通过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)也被排除在外。