SQL Server - 查询仅返回在另一列中每个ID具有不同值的ID

时间:2018-03-06 00:31:17

标签: sql sql-server

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'sID的所有记录不匹配,我怎么做到这一点?

如果我的表仅包含上面第二个示例中的数据,结果将如下所示。

ID
1
3
4

或者,如果结果作为整个记录返回,只要记录包含ID,并且每ID只有一条记录,我们就会非常适合。返回的BatchID无关紧要。

2 个答案:

答案 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,那么蒂姆的回答是更好的方法。