2014-09-19 79 views
0

我正在使用sqlplus做一批插入(不幸的是我不能使用sqlldr)。每个插入语句都需要来自另一个表的值,例如:减少sqlplus中的重复

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

回答

3

你可以使用子查询或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时,应指定要插入的列的名称。这有助于防止未来的问题。

0

如果源数据是带有delimeters的文本文件,则可以使用Excel或正则表达式生成sql脚本。

您也可以将源数据加载到中间表中。然后将该表与“地址”表联接起来,并将结果插入“标签”表中。