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

问题描述 投票:0回答:2

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无关紧要。

sql sql-server
2个回答
5
投票

使用聚合并计算每个ID的不同批次数:

SELECT ID
FROM yourTable
GROUP BY ID
HAVING COUNT(DISTINCT BatchID) > 1;

1
投票

如果你碰巧想要整行,你可以这样做:

select t.*
from t
where exists (select 1
              from t t2
              where t2.id = t.id and t2.batchid <> t.batchid
             );

如果你只想要ids,那么蒂姆的回答是更好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.