Есть ли эффективный способ избежать объединений фиксированных значений в SQL? - PullRequest
3 голосов
/ 24 марта 2011

Например, с Oracle: я хочу использовать временную таблицу для слияния:

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)
;

Шаблон SELECT UNION SELECT здесь действительно раздражает, и я нахожу его отвратительным (повторяющимся, многословным).

У вас есть способ подделать похожие запросы, будь то специфичный для Oracle или нет?

Спасибо

Ответы [ 4 ]

6 голосов
/ 24 марта 2011

Benoit,

Вы можете использовать это для таблиц с одним столбцом:

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.

Для более чем одного столбца вам нужно создать два типа (или использовать существующие),как это:

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.

С уважением,
Роб.

3 голосов
/ 24 марта 2011

В SQL Server 2008 вы можете использовать предложение VALUES. Не уверен, что это доступно в Oracle или нет, но вы специально запрашиваете все методы.

Пример синтаксиса

SELECT col1 FROM (VALUES ('a'),('foo'), ('doh')) T  (col1)
2 голосов
/ 24 марта 2011

Есть несколько способов сделать это (как уже указано выше, вот еще несколько)

все это из вопроса асктома: http://tkyte.blogspot.com/2006/06/varying-in-lists.html а также http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:210612357425

var mystring varchar2
begin
:mystring := trim('a,foo,doh,b,x');
end;
/


SELECT 

    substr(v.mystring, v.start_of_string, v.next_comma_location - v.start_of_string) "The String"
      FROM (SELECT comma_location + 1 start_of_string,
                   mystring,
                   nvl(lead(comma_location, 1) over(ORDER BY comma_location), mystring_length + 1) AS 
    next_comma_location
              FROM (SELECT :mystring mystring,
                           instr(:mystring, ',', LEVEL) comma_location,
                           length(:mystring) mystring_length
                      FROM dual
                    CONNECT BY LEVEL < length(:mystring))) v
     WHERE v.start_of_string < v.next_comma_location;

- или http://laurentschneider.com/wordpress/2007/12/predefined-collections.html

 select * from table(sys.odcivarchar2List('a','foo','doh','b','x'));




 COLUMN_VALUE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
----------------
a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
foo                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
doh                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
x 

Вы можете рассматривать их как таблицы

1 голос
/ 24 марта 2011

Ну, я согласен, что

    SELECT 'a'   col1 FROM dual 
    UNION SELECT 'foo' col1 FROM dual 
    UNION SELECT 'doh' col1 FROM dual

дерьмо. Согласитесь ли вы, что

    SELECT 'a'   col1 FROM dual 
    UNION ALL SELECT 'foo' col1 FROM dual 
    UNION ALL SELECT 'doh' col1 FROM dual

нет?

EDIT

Если вам не нравится какая-то часть грамматики, вы можете попробовать динамический SQL (но понимаете, что это ваше личное предпочтение, поэтому постарайтесь не делать этого в больших системах).

Вот ссылка http://www.oracle -base.com / Articles / Misc / DynamicInLists.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...