【问题标题】:How to union multiple times same SQL如何联合多次相同的SQL
【发布时间】:2020-12-16 05:43:09
【问题描述】:

我有这样的查询

select 1,2,3 from dual
union all
select 1,2,3 from dual

当我需要添加新行时,我将另一个并集全部放置,这没关系。但是当我需要几个联合时出现问题,例如20个。再做17个联合真的很烦人而且效率不高。有没有办法(一些程序,任何功能)让它更快更优雅?

【问题讨论】:

  • SQL 不是很擅长生成数据,而是查询它并在已经存在的数据上提供结果。这里的一种方法是只生成一个包含所需行数的平面 CSV 文件,然后使用 Oracle 的加载器工具将其移动到表中。
  • @TimBiegeleisen 好吧,对于 jasper,我需要这种方式
  • 这里有一个类似的 mysql 问题:stackoverflow.com/questions/33402899/… - 不确定 Oracle 是否会允许类似的事情..

标签: sql oracle


【解决方案1】:

没问题,很简单。

SQL> select 1, 2, 3
  2  from dual
  3  connect by level <= 10;

         1          2          3
---------- ---------- ----------
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3
         1          2          3

10 rows selected.

SQL>

【讨论】:

    【解决方案2】:

    有时在这种情况下使用 json_table 会更容易:

    select *
    from json_table(
      '{data:[
         [1,2,3,"abc"],
         [2,3,4,"def"],
         [3,4,5,"xyz"],
        ]
       }'
       ,'$.data[*]'
       columns
          a number path '$[0]',
          b number path '$[1]',
          c number path '$[2]',
          d varchar2(30) path '$[3]'
    );
    

    结果:

             A          B          C D
    ---------- ---------- ---------- ------------------------------
             1          2          3 abc
             2          3          4 def
             3          4          5 xyz
    

    【讨论】:

    • 我觉得挺尴尬的,Oracle 还不支持标准valuesrow constructor
    • @a_horse_with_no_name 是的,我经常想念它...和 ​​generate_series... 但是考虑到 CBO 已经很复杂以及它支持多少功能/转换/等,我认为这还不错有点保守。至少,我认为拥有一个好的规划器比拥有大量带有更多错误的语法结构要好。
    【解决方案3】:

    Littlefoot 答案的变体:

    select 1, 2, 3
    from   xmltable('1 to 20');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      相关资源
      最近更新 更多