有没有一种有效的方法来避免SQL中固定值的UNION?

Ben*_*oit 3 sql oracle coding-style

例如使用Oracle:我想要一些临时表用于Merge:

MERGE INTO my_target_table
USING (
        WITH tbl1 AS (       SELECT 'a'   col1 FROM dual            -- <--- THIS
                       UNION SELECT 'foo' col1 FROM dual            -- <--- IS
                       UNION SELECT 'doh' col1 FROM dual            -- <--- CRAPPY
                     ),
             tbl2 AS (       SELECT 'b'   col2, 'c' col3 FROM dual  -- <--- THIS
                       UNION SELECT 'x'   col2, 's' col3 FROM dual  -- <--- ALSO
                     )
        SELECT col1, col2, col3 FROM tbl1 CROSS JOIN tbl2
      ) my_source_view
   ON (     my_target_table.col1 = my_source_view.col1
        AND my_target_table.col2 = my_source_view.col2
      )
 WHEN MATCHED THEN UPDATE
                      SET my_target_table.col3 = my_source_view.col3
 WHEN NOT MATCHED THEN INSERT(               col1,                col2,                col3)
                       VALUES(my_source_view.col1, my_source_view.col2, my_source_view.col3)
;
Run Code Online (Sandbox Code Playgroud)

SELECT UNION SELECT这里的模式真的很烦人,我发现它很可怕(重复,冗长).

您是否有诀窍来形成类似的查询,无论是否特定于Oracle?

谢谢

Rob*_*ijk 6

贝努瓦,

您可以将此用于包含一列的表:

SQL> with tbl1 as
  2  ( select column_value col1
  3      from table(sys.dbms_debug_vc2coll('a','foo','doh'))
  4  )
  5  select *
  6    from tbl1
  7  /

COL1
------------------------------------------------------------
a
foo
doh

3 rows selected.
Run Code Online (Sandbox Code Playgroud)

对于多个列,您需要创建两种类型(或使用现有类型),如下所示:

SQL> create type ot is object
  2  ( col1 varchar2(1)
  3  , col2 varchar2(1)
  4  );
  5  /

Type created.

SQL> create type ntt is table of ot;
  2  /

Type created.

SQL> with tbl2 as
  2  ( select *
  3      from table(ntt(ot('b','c'),ot('x','s')))
  4  )
  5  select *
  6    from tbl2
  7  /

C C
- -
b c
x s

2 rows selected.
Run Code Online (Sandbox Code Playgroud)

问候,
Rob.