将数据插入到表中,其中部分数据来自另一个表

问题描述 投票:0回答:1

我对 oracle 和 sql 不太熟悉,想问一些问题。假设我在 txt 数据上有这样的数据:

Agt代码 销售
000001 20,000
000002 25,000

我想将其插入到具有如下结构的表(sales_master)中

|代理代码 |代理名称 |工作 |销售|

对于 Agt 名称和作业信息已经位于数据库的另一个表 (agt_info) 中,如下所示:

Agt代码 代理姓名 工作
000001 约翰·多伊 营销
000002 乔·肖恩 销售

那么如何为该数据创建插入语句呢?而因为我有5000行数据要插入,如何高效插入呢?

我想直接创建一条插入语句,因为这只是一次,但因为有很多数据需要查看其他表,我认为处理它会占用很多资源。

提前谢谢您。

oracle-sqldeveloper
1个回答
0
投票

此示例展示了如何使用外部表进行操作。

这是目标表(所有数据应插入此处):

SQL> desc sales_master
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 AGT_CODE                                           VARCHAR2(6)
 AGT_NAME                                           VARCHAR2(20)
 JOB                                                VARCHAR2(20)
 SALES                                              NUMBER

这是您已有的表,它有一些数据:

SQL> select * from agt_info;

AGT_CO AGT_NAME             JOB
------ -------------------- --------------------
000001 John Doe             Marketing
000002 Joe Sean             Sales

为了能够使用外部表,您必须与 DBA 交谈

  • 创建目录 - Oracle 对象,该对象指向通常位于数据库服务器上的目录(文件夹),并且
  • 向将使用它的用户授予权限(通常是
    read
    write

我不是 DBA,也没有权限进行现场演示,但是 - 如果您实际上是 DBA - 这就是您应该做的。以 SYS 身份连接并运行以下语句(当然,您可以使用自己的目录名称和用户):

create directory ext_dir as 'c:\temp';
grant read, write on directory ext_dir to scott;

然后,以将加载数据的用户身份进行连接。就我而言,那就是
scott

SQL> show user
USER is "SCOTT"
SQL> select directory_name from all_directories;

DIRECTORY_NAME
------------------------------
EXT_DIR

样本数据存储在
txt_data.txt

文件中,该文件位于数据库服务器上的

c:\temp
目录中。其内容是
000001,20000
000002,25000

创建外部表:

SQL> create table txt_data 2 (agt_code varchar2(6), 3 sales varchar2(10) 4 ) 5 organization external 6 (type oracle_loader 7 default directory ext_dir 8 access parameters 9 (records delimited by newline 10 fields terminated by ',' 11 missing field values are null 12 (agt_code, 13 sales 14 ) 15 ) 16 location ('txt_data.txt') 17 ); Table created.

我能看到任何数据吗?

SQL> select * from txt_data; AGT_CO SALES ------ ---------- 000001 20000 000002 25000

好的;剩下的很简单:编写一个 
insert

语句,连接来自

agt_info
txt_data
的数据:
SQL> insert into sales_master (agt_code, agt_name, job, sales)
  2    select t.agt_code, i.agt_name, i.job, to_number(replace(t.sales, chr(13)))
  3    from txt_data t join agt_info i on i.agt_code = t.agt_code;

2 rows created.

最终结果:

SQL> select * from sales_master; AGT_CO AGT_NAME JOB SALES ------ -------------------- -------------------- ---------- 000001 John Doe Marketing 20000 000002 Joe Sean Sales 25000 SQL>

© www.soinside.com 2019 - 2024. All rights reserved.