含不存在值的UNION ALL未返回预期结果,求替代SQL方案
问题描述
现有数据表:
Fk| field1 | field2 ==================== 1|r |lo 2 |abcd |mem 3 |efghi |mem 4 |abcd |mem 5 |efghi |mem
需求为获取指定field1值对应的单条数据。尝试执行以下SQL查询:
(Select * from table where field1='abd' limit 1) union all (Select * from table where field1='abcd' limit 1)
已知field1中不存在'abd',预期应返回field1='abcd'对应的单条结果,但实际未得到该结果。
替代解决方案
方案一:使用窗口函数(通用型)
通过ROW_NUMBER()窗口函数按field1分组,每组取第一条数据,再筛选目标field1值,不管指定值是否存在,都只会返回存在的对应单条数据:
SELECT Fk, field1, field2 FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY Fk) AS rn FROM `table` -- 注意:`table`是SQL保留关键字,需用反引号包裹 WHERE field1 IN ('abd', 'abcd') ) t WHERE rn = 1;
方案二:修正原查询的语法问题
如果原查询失败是因为表名table是SQL保留关键字,只需给表名加上反引号(不同数据库语法有差异,比如Oracle用双引号),即可正常执行:
(SELECT * FROM `table` WHERE field1='abd' LIMIT 1) UNION ALL (SELECT * FROM `table` WHERE field1='abcd' LIMIT 1)
方案三:简化查询(适用于仅需单个目标值的场景)
如果只需要获取abcd对应的单条数据,直接简化查询即可:
SELECT * FROM `table` WHERE field1='abcd' LIMIT 1;
内容的提问来源于stack exchange,提问作者Navjyoti Rath
相关产品推荐
相关产品推荐

