TSQL中When Then聚合函数查询仅返回单值表达式的问题求解
解决方案
你当前返回全表n行的核心原因是FROM IMPORT.DATA_SCRAP未加任何行过滤条件,数据库会对该表的每一行都执行一次SELECT逻辑,自然返回和表行数一致的结果。要保留FROM子句的前提下只返回单个值,可采用以下方案:
方案1:直接限制返回行数(最适合当前测试场景)
根据你使用的数据库类型,在查询末尾加行数限制语法即可:
- MySQL/PostgreSQL/Hive等:末尾加
LIMIT 1 - SQL Server:SELECT后加
TOP 1 - Oracle:末尾加
WHERE ROWNUM = 1
修改后示例代码(以MySQL为例):
-- 州查询示例 select case when ((SELECT COUNT(stateName) FROM Location.tblState where stateName = 'Utah')=1) -- 注意原逻辑此处返回两个字段会报错,需改为返回单个字段或拼接两个字段 then (select CONCAT(stateName,',',CountryName) from Location.tblState where stateName= 'Utah') end as nameof from IMPORT.DATA_SCRAP LIMIT 1;
-- 城市关联查询示例 select case when ((SELECT COUNT(cityName) FROM Location.tblCity where cityName = 'Kathmandu')=1) then (select ct.countryName from Location.tblCity c inner join Location.tblState s on c.stateID = s.StateID inner join Location.tblCountry ct on ct.countryId = s.CountryId where c.cityName = 'Kathmandu' ) end as nameof from IMPORT.DATA_SCRAP LIMIT 1;
方案2:逻辑过滤取指定行(适合后续正式场景扩展)
如果后续要把静态测试值替换为IMPORT.DATA_SCRAP表的Location列逐行匹配,可先取一行定位数据再做匹配,避免全表扫描:
-- 示例取DATA_SCRAP表的第一行Location值做匹配,可根据业务调整WHERE条件 select case when ((SELECT COUNT(cityName) FROM Location.tblCity where cityName = t.Location)=1) then (select ct.countryName from Location.tblCity c inner join Location.tblState s on c.stateID = s.StateID inner join Location.tblCountry ct on ct.countryId = s.CountryId where c.cityName = t.Location ) end as nameof from (SELECT Location FROM IMPORT.DATA_SCRAP LIMIT 1) t;
注意事项
- 你原第一个测试查询的THEN子句返回了
stateName, CountryName两个字段,作为CASE表达式的返回值会触发语法错误,需调整为返回单个值,比如用CONCAT函数拼接两个字段,或者单独返回其中一个字段。 - 如果后续业务要求是对
IMPORT.DATA_SCRAP全表每行的Location都做匹配输出,只需要去重的结果,可在SELECT后加DISTINCT关键字即可。
内容的提问来源于stack exchange,提问作者eUP FlyWithMe
相关产品推荐
相关产品推荐

