在交叉字段上过滤重复项

时间:2018-01-18 12:14:45

标签: sql sql-server tsql

所以,我有一些记录:

[ fid  sid ]
   1    2
   1    3
   1    4
   2    1
   2    3
   2    4
   3    1
   3    2
   3    4
    ....

两个字段都包含ID。我只需要获得uniq或first not-uniq记录,但只需要交叉字段。 例如[2,1]和[1,2]不是uniq。

最后我希望:

[ fid  sid ]
   1    2
   1    3
   1    4
   2    3
   2    4
   3    4
    ....

这些是已经过滤的记录:

[ fid  sid ]
   2    1
   3    1
   3    2
    ....

感谢您的回答!

3 个答案:

答案 0 :(得分:2)

如果您没有重复项,则可以执行以下操作:

select fid, sid
from t
where fid <= sid
union all
select fid, sid
from t
where fid > sid and
      not exists (select 1 from t t2 where t2.fid = t.sid and t2.sid = t.fid);

如果您确实有重复项并且不关心订购,您可以这样做:

select (case when fid < sid then fid else sid end) as sid,
       (case when fid < sid then sid else fid end) as sid
from t
group by (case when fid < sid then fid else sid end),
         (case when fid < sid then sid else fid end);

这可能会产生不在原始数据中的对(因为逆在数据中)。

答案 1 :(得分:1)

这是一种使用左连接的方式,只保留那些没有匹配的连接。

示例代码:

declare @T table (fid int, [sid] int);

insert into @T (fid, [sid]) values
(1, 2),(1, 3),(1, 4),
(2, 1),(2, 3),(2, 4),
(3, 1),(3, 2),(3, 4);

select distinct t.fid, t.[sid]
from @T t
left join @T t2 on (t2.[sid] = t.fid and t2.fid = t.[sid] and t2.fid < t2.[sid])
where t2.fid is null
order by t.fid, t.[sid];

结果:

fid sid
1   2
1   3
1   4
2   3
2   4
3   4

与NOT EXISTS相同的结果:

select distinct fid, [sid]
from @T t
where not exists (
 select 1 from @T t2
 where t2.[sid] = t.fid and t2.fid = t.[sid] and t2.fid < t2.[sid]
)
order by fid, [sid];

答案 2 :(得分:0)

订购的另一个方法是:

SELECT DISTINCT [fid] ,[sid]

  FROM aaa where 

  CAST(fid AS VARCHAR(2) ) + '.'+ CAST(sid AS VARCHAR(2) ) not in 

  (SELECT DISTINCT CAST(sid AS VARCHAR(2) ) + '.'+ CAST(fid AS VARCHAR(2))

  FROM aaa)

虽然根据您执行的次数以及处理的数据量,可能不建议这样做。