SQL Server 2016 Enterprise - 假设我在主表上运行查询以从ID 1到5中恢复所有记录。我会得到这样的结果:
ID Status BatchID
1 Active 493fd8bc
1 Active 493fd8bc
1 Active 493fd8bc
1 Active 493fd8bc
1 Active 493fd8bc
2 Active 2d91c2f2
2 Active 2d91c2f2
3 Active 2a1338ac
3 Active 2a1338ac
3 Active 2a1338ac
4 Active 0c469bcc
4 Active 0c469bcc
4 Active 0c469bcc
4 Active 0c469bcc
4 Active 0c469bcc
4 Active 0c469bcc
4 Active 0c469bcc
5 Active ca8896bd
5 Active ca8896bd
5 Active ca8896bd
以上是我们期望看到的,这样每个ID
都有与之相关的BatchID
(区分每个记录的其他列与此问题无关)。
我们遇到了一些问题,我们看到所有ID's
并非如此。例如,假设我们运行相同的查询,它返回了这个:
ID Status BatchID
1 Active 493fd8bc
1 Active 493fd8bc
1 Active 752e8d5d
1 Active 752e8d5d
1 Active 493fd8bc
2 Active 2d91c2f2
2 Active 2d91c2f2
3 Active f2191595
3 Active 2a1338ac
3 Active 2a1338ac
4 Active feaf9567
4 Active f5d64c8c
4 Active e5eff3a2
4 Active 0c469bcc
4 Active 49e5e2f2
4 Active 0c469bcc
4 Active e5eff3a2
5 Active ca8896bd
5 Active ca8896bd
5 Active ca8896bd
在这种情况下,我们看到ID's
1,3和4的BatchID
并不都匹配。
如果我想对所有ID's
运行查询并让它返回给我一个ID's
列表,其中BatchID's
不匹配该ID
的所有记录,我将如何实现这一目标?
如果我的表只包含上面第二个例子中的数据,结果将如下所示。
ID
1
3
4
或者,如果结果作为整个记录返回,只要记录包含ID
,并且每个ID
只有一条记录,我们就会非常适合。返回的BatchID
无关紧要。
使用聚合并计算每个ID
的不同批次数:
SELECT ID
FROM yourTable
GROUP BY ID
HAVING COUNT(DISTINCT BatchID) > 1;
如果你碰巧想要整行,你可以这样做:
select t.*
from t
where exists (select 1
from t t2
where t2.id = t.id and t2.batchid <> t.batchid
);
如果你只想要ids,那么蒂姆的回答是更好的方法。