所以,我有一些记录:
[ 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
....
感谢您的回答!
答案 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)
虽然根据您执行的次数以及处理的数据量,可能不建议这样做。