使用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]
任何聚合函数都可以。
答案 0 :(得分:6)
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])
请参阅小提琴here。
答案 1 :(得分:1)
Where子句在select语句之前逻辑执行。因此,在where子句中找不到选择列表中提到的别名,因为select将执行next。 这是真的:
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
答案 2 :(得分: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
答案 3 :(得分:0)
我可能在这里错了,但我认为以下会做
Select Data from T Group by Data having count(*) = 1