SQL中如何检查唯一值?请求修正Bank表的查询语句
解决Bank表重复值标识计算列问题
你的原查询无法运行的核心问题是:子查询SELECT Bank_Value FROM [Bank] GROUP BY Bank_Value HAVING COUNT(*) = 1可能返回多行结果,而=运算符仅支持单行值比较,因此会触发语法/逻辑错误。同时原逻辑也未准确匹配需求——你需要判断当前行的Bank_Value(去空后)的出现次数是否大于1,而非和某个唯一值做相等判断。
以下是两种可行的修正方案:
方法1:使用窗口函数(推荐,性能更优)
窗口函数可以直接在每行计算对应Bank_Value的出现次数,无需额外关联操作:
SELECT Bank_Value, CASE WHEN COUNT(*) OVER (PARTITION BY NULLIF(LTRIM(RTRIM(Bank_Value)), '')) > 1 THEN '1' -- 标记为存在重复 ELSE '0' -- 标记为唯一值 END AS Bank_Value_Unique FROM [Bank]
逻辑说明
NULLIF(LTRIM(RTRIM(Bank_Value)), ''):先对Bank_Value做去首尾空格处理,若处理后为空则转为NULL(避免空字符串被当作独立值统计)COUNT(*) OVER (PARTITION BY ...):按去空后的Bank_Value分组,计算每组的行数(即该值的出现次数)- 根据次数判断:次数>1则标记为'1'(重复),否则为'0'(唯一)
方法2:使用分组子查询关联
先分组统计每个去空后Bank_Value的出现次数,再与原表关联匹配:
SELECT b.Bank_Value, CASE WHEN t.cnt > 1 THEN '1' ELSE '0' END AS Bank_Value_Unique FROM [Bank] b LEFT JOIN ( SELECT NULLIF(LTRIM(RTRIM(Bank_Value)), '') AS cleaned_value, COUNT(*) AS cnt FROM [Bank] GROUP BY NULLIF(LTRIM(RTRIM(Bank_Value)), '') ) t ON NULLIF(LTRIM(RTRIM(b.Bank_Value)), '') = t.cleaned_value
逻辑说明
- 子查询先对所有Bank_Value做去空处理,分组统计每个值的出现次数
- 原表通过去空后的值与子查询结果关联,获取当前行对应值的出现次数
- 根据次数判断是否标记为重复
内容的提问来源于stack exchange,提问作者KND894GJ
相关产品推荐
相关产品推荐

