代码之家  ›  专栏  ›  技术社区  ›  Seymour

Oracle中r cbind()函数的等价项?

  •  1
  • Seymour  · 技术社区  · 6 年前

    我是sql新手,正在努力解决这个非常简单的任务。

    考虑到,

        with table1 as (select '1' col1 from dual union
    select '2' col1 from dual union
    select 'NO_PATTERN' col1 from dual union
    select 'RANDOM_STUFF' col1 from dual)
        select * from table1;
    

    而且,

        with table2 as (select 'aaa' col2 from dual union
    select '4' col2 from dual union
    select 'qwewqeq' col2  from dual
    union select 'UUUUUU' col2 from dual)
        select * from table2;
    

    我想表演 cbind() 在两列之间形成一个新表,表1[col1]和表2[col2]的“垂直并集”。

    这个 预期 解决方案是:

        with solution as (select '1' col1, 'aaa' col2 from dual union
    select '2' col1, '4' col2 from dual union
    select 'NO_PATTERN'  col1, 'qwewqeq' col2 from dual union
    select 'RANDOM_STUFF'  col1, 'UUUUUU'  col2 from dual)
        select * from solution;
    

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Aleksej    6 年前

    在oracle中,您需要显式地定义一些值来获取有序数据;如果没有这个值,则每次运行查询时可能会有不同的结果。

    根据你的数据,这:

    WITH table1 AS
             (SELECT 1 rn, '1'            col1 FROM DUAL UNION
              SELECT 2 rn, '2'            col1 FROM DUAL UNION
              SELECT 3 rn, 'NO_PATTERN'   col1 FROM DUAL UNION
              SELECT 4 rn, 'RANDOM_STUFF' col1 FROM DUAL),
         table2 AS
             (SELECT 1 rn, 'aaa'     col2 FROM DUAL UNION
              SELECT 2 rn, '4'       col2 FROM DUAL UNION
              SELECT 3 rn, 'qwewqeq' col2 FROM DUAL UNION
              SELECT 4 rn, 'UUUUUU'  col2 FROM DUAL)
    SELECT col1, col2, t1.rn
    from (select  row_number() over (order by rn) as rn, col1 from table1 ) t1
           inner join 
         (select row_number() over (order by rn) as rn, col2 from table2 ) t2
         on (t1.rn = t2.rn)
    

    给予:

    COL1         COL2            RN
    ------------ ------- ----------
    1            aaa              1
    2            4                2
    NO_PATTERN   qwewqeq          3
    RANDOM_STUFF UUUUUU           4
    

    例如,没有明确的顺序

    WITH table1 AS
             (SELECT '1'            col1 FROM DUAL UNION
              SELECT '2'            col1 FROM DUAL UNION
              SELECT 'NO_PATTERN'   col1 FROM DUAL UNION
              SELECT 'RANDOM_STUFF' col1 FROM DUAL),
         table2 AS
             (SELECT 'aaa'     col2 FROM DUAL UNION
              SELECT '4'       col2 FROM DUAL UNION
              SELECT 'qwewqeq' col2 FROM DUAL UNION
              SELECT 'UUUUUU'  col2 FROM DUAL)
    SELECT col1, col2, t1.rn
    from (select  rownum as rn, col1 from table1 ) t1
           inner join 
         (select rownum as rn, col2 from table2 ) t2
         on (t1.rn = t2.rn)
    

    给予

    COL1         COL2            RN
    ------------ ------- ----------
    1            4                1
    2            UUUUUU           2
    NO_PATTERN   aaa              3
    RANDOM_STUFF qwewqeq          4
    
        2
  •  0
  •   Rahul Agarwal    6 年前

    如果你不想点菜,这是个简单的方法-

    select *, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO into #0 FROM Table 2
    
    select *, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO into #1 FROM Table1
    
    select a.*, b.* into #3 from #0 a join #1 b on a.SNO = b.SNO
    

    从这里得到主意-

    https://blog.sqlauthority.com/2015/05/05/sql-server-generating-row-number-without-ordering-any-columns/