4

使用SQL Server 2012. T如果只存在一个不同的值,我想从表中选择一个不同的值。下面我有一个我正在尝试做的简化示例。

此数据将导致 1 个返回值:'bbb'

ID    Data
----------
1    'bbb'

这些数据也是如此:

ID    Data
----------
1    'bbb'
2    'bbb'
3    'bbb'

但是此数据将导致 0 返回行:

ID    Data
----------
1    'aaa'
2    'bbb'
3    'bbb'

理想情况下,有一种方法可以计算WHERE子句中的行数(不分组数据)。另外,请记住我的原始查询非常复杂。对于这个简化版本,我尝试了类似的方法,但它不起作用:

SELECT [Data] FROM
    (SELECT [Data], COUNT(*) OVER() AS [DinstinctValueCount] FROM
        (SELECT DISTINCT [Data] FROM [T]) [A]) [B] WHERE [DistinctValueCount] = 1

列名“DistinctValueCount”无效。

更新

我找到了解决方案。有更好的吗?

SELECT CASE WHEN COUNT(*) = 1 THEN MIN([Data]) ELSE NULL END AS [Data] FROM
    (SELECT DISTINCT [Data] FROM [T]) [A]

任何聚合函数都可以。

4

4 回答 4

7
SELECT MIN(ID), [Data]
FROM [tablename]
GROUP BY [Data]
HAVING
  1=(SELECT COUNT(DISTINCT [Data]) FROM [tablename])

或者如果你不想重复 [tablename],你可以使用这样的东西:

SELECT MIN(ID), MIN([Data])
FROM [tablename]
HAVING MIN([Data])=MAX([Data])

在此处查看小提琴。

于 2013-10-16T14:08:58.413 回答
1

Where 子句在 select 语句之前逻辑执行。因此,在 where 子句中找不到 select 列表中提到的别名,因为 select 将在下一个执行。真的是这样:

with s as (
     SELECT [Data] FROM
        (SELECT [Data], COUNT(*) OVER() AS [DinstinctValueCount] FROM
            (SELECT DISTINCT [Data] FROM [T]) [A]) [B] )
     SELECT * FROM S WHERE  [DinstinctValueCount]= 1
于 2013-10-16T13:59:36.420 回答
1

尝试这样的事情。

SELECT t1.* 
FROM tbl t1
JOIN ( 
  SELECT data
  FROM tbl t2
  GROUP BY data
  HAVING COUNT(1) = (SELECT COUNT(1) FROM tbl)
) t2 ON t2.data = t1.data
于 2013-10-16T13:59:53.723 回答
0

我可能在这里错了,但我认为以下会做

Select Data from T Group by Data having count(*) = 1
于 2013-10-16T14:16:45.140 回答