使 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 关闭的主要内容,如果未能解决你的问题,请参考以下文章

SQL高级查询技巧

SQL高级查询技巧

SQLAlchemy 单个查询从两个表中返回列

添加行而不覆盖(Python)[重复]

强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?

SQL总结 连表查询