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
的{{1}}列表BatchID's
与ID
的所有记录不匹配,我怎么做到这一点?
如果我的表仅包含上面第二个示例中的数据,结果将如下所示。
ID
1
3
4
或者,如果结果作为整个记录返回,只要记录包含ID
,并且每ID
只有一条记录,我们就会非常适合。返回的BatchID
无关紧要。
答案 0 :(得分:5)
使用聚合并计算每个ID
的不同批次数:
SELECT ID
FROM yourTable
GROUP BY ID
HAVING COUNT(DISTINCT BatchID) > 1;
答案 1 :(得分:1)
如果你碰巧想要整行,你可以这样做:
select t.*
from t
where exists (select 1
from t t2
where t2.id = t.id and t2.batchid <> t.batchid
);
如果你只想要ids,那么蒂姆的回答是更好的方法。