Уменьшите дублирование в sqlplus

Я использую sqlplus для выполнения партии вставок (к сожалению, я не могу использовать sqlldr). Каждому оператору вставки требуется значение из другой таблицы, например:

INSERT INTO tab VALUES (1, 'a', (SELECT id FROM addressTab WHERE name = 'xyz') );
INSERT INTO tab VALUES (2, 'b', (SELECT id FROM addressTab WHERE name = 'xyz') );
INSERT INTO tab VALUES (3, 'c', (SELECT id FROM addressTab WHERE name = 'xyz') );
INSERT INTO tab VALUES (4, 'd', (SELECT id FROM addressTab WHERE name = 'xyz') );
INSERT INTO tab VALUES (5, 'e', (SELECT id FROM addressTab WHERE name = 'mno') );
INSERT INTO tab VALUES (6, 'f', (SELECT id FROM addressTab WHERE name = 'mno') );

Название общее для многих вставок. Как мне избежать повторного запроса addressTab на одно и то же имя?


person Rnet    schedule 19.09.2014    source источник


Ответы (2)


Вы можете настроить данные с помощью подзапроса или CTE:

insert into tab
    select d.x, d.y, a.id
    from (select 1 as x, 'a' as y, 'xyz' as name from dual union all
          . . .
          select 6, 'f', 'mno' from dual
         ) d join
         addressTab a
         on d.name = a.name;

Если первые два значения взяты из таблицы, это еще проще.

Кстати, при использовании insert следует указывать имена вставляемых столбцов. Это помогает предотвратить проблемы в будущем.

person Gordon Linoff    schedule 19.09.2014

Если исходные данные представляют собой текстовый файл с разделителями, вы можете сгенерировать sql-скрипт с помощью Excel или с регулярным выражением.

Также вы можете загрузить исходные данные в промежуточную таблицу. Затем соедините эту таблицу с таблицей «адресов» и вставьте результат в таблицу «табуляция».

person ksa    schedule 19.09.2014