使 SQL 查询返回重复行而不使用 UNION ALL 关闭
Posted
技术标签:
【中文标题】使 SQL 查询返回重复行而不使用 UNION ALL 关闭【英文标题】:Make an SQL query return duplicate rows without using the UNION ALL close 【发布时间】:2020-10-22 19:05:57 【问题描述】:我有一个用例暗示即使多次指定相同的 id 也会返回所有记录
select d.id from data d where d.id in (1420552, 1420553)
union all
select d.id from data d where d.id in (1420552, 1420553)
由于“IN”谓词只是被翻译为所有指定值之间的“OR”,它不会给我想要的结果。
select d.id from data d where d.id in (1420552, 1420553, 1420552, 1420553)
因此,我想知道是否有任何替代方法可以获得所需的结果。 提前谢谢你。
【问题讨论】:
【参考方案1】:非常奇怪的用例...
但假设您的 Db2 平台和版本支持表值构造函数...
试试
with cte(id)
as (values (1420552),(1420553)
,(1420552),(1420553) )
select d.id
from data d
join cte c on d.id = c.id;
【讨论】:
您好查尔斯,非常感谢您的回答。您建议的查询正在返回所需的结果。由于此查询使用公用表表达式 (cte),因此 hibernate V3.x 不支持此 SQL 功能。出于可移植性的原因,该项目使用 HQL,我将在下周一与首席开发人员交谈,询问他是否可以在此特殊用例的应用程序中引入本机查询。 @user3072470 你可以作为一个 nte 来做,我只是更喜欢 cte。不要忘记投票并标记为已接受。【参考方案2】:我可能会使用cross join
:
select d.id
from data d cross join
(select 1 from sysibm.sysdummy1 union all
select 2 from sysibm.sysdummy1 union all
) n
where d.id in (1420552,1420553);
或者更简洁:
select d.id
from data d cross join
(values (1), (2)) v(n)
where d.id in (1420552,1420553);
【讨论】:
非常感谢您的回答。正如我在我的问题中提到的,相同的 ID 可以在查询中多次使用,例如,如果 1420552 在“IN”谓词中使用 5 次,则查询必须返回 5 次 ID = 1420552 的同一行,我希望我设法解释了要求。select d.id from data d cross join (values (1), (2)) v(n) where d.id in (1420552,1420552,1420552,1420552,1420552,1420553,1420553,1420553);
以上是关于使 SQL 查询返回重复行而不使用 UNION ALL 关闭的主要内容,如果未能解决你的问题,请参考以下文章