我想在下表中查找成对的行
MS SQL 2012(也许是2014年)
Ref, Split
1, A
1, B
2, B
3, A
3, B
结果
Ref, Split
1, A
1, B
3, A
3, B
成对的行由'Ref'分隔,即1和3需要返回,但是2没有一对,因此不应返回
默认情况下,我会使用OVER,但是我认为这太过分了,不是处理此问题的最有效方法。
有哪些替代方案
答案 0 :(得分:0)
为什么不使用自联接并将结果放在一行中?
select t1.ref, t1.split, t2.split
from t t1 join
t t2
on t1.ref = t2.ref;
或者,如果您希望原始行使用exists
:
select t.*
from t
where exists (select 1 from t t2 where t2.ref = t.ref and t2.split <> t.split);
答案 1 :(得分:0)
如果您的DBMS支持count() over()
,这就是方法。
select t.Ref, t.Split
from (
select Ref, Split, count(distinct Split) over(partition by Ref) cnt
) t
where t.cnt > 1
-- cnt = 2 if exactly the pairs are required