您的帖子似乎不清楚,因为我认为您在描述的某些部分混淆了列名。但是,从您的示例输出来看,我将假设您的意思如下:
从表中选择field2
包含相同值的行field1
。
如果您只需要输出field1
and field2
,您可以执行以下操作:
SELECT field1, MAX(field2) AS field2
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
如果您的表不能DISTINCT
包含重复的(field1, field2)
.
但是,如果表中有更多列并且还需要返回部分或全部列,则可以首先获取上述field1
值,然后将该行集合返回atable
以获取完整行,如下所示:
SELECT t.* /* or specify the necessary columns explicitly */
FROM atable AS t
INNER JOIN (
SELECT field1
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
) s ON t.field1 = s.field1
同样,DISTINCT
可以省略,如上所述。
由于您使用的是 SQL Server 2008,因此您也可以使用窗口聚合。如果您的表不包含 的重复项(field1, field2)
,则可以使用以下内容:
;
WITH counted AS (
SELECT
*,
cnt = COUNT(*) OVER (PARTITION BY field1)
FROM atable
)
SELECT
field1,
field2,
…
FROM counted
WHERE cnt = 1
但如果允许重复,则需要使用稍微不同的方法,因为COUNT(DISTINCT …)
. 以下是您可以尝试的方法:
;
WITH counted AS (
SELECT
*,
f2min = MIN(field2) OVER (PARTITION BY field1),
f2max = MAX(field2) OVER (PARTITION BY field1)
FROM atable
)
SELECT
field1,
field2,
…
FROM minmaxed
WHERE f2min = f2max
也就是说,您将获得field2
每个field1
值的最小值和最大值。然后,您将过滤掉f2min
与 不同的行f2max
,因为这意味着field2
组中存在不同的值。