Oracle插入数据的问题

clarck_913 2010-11-22 10:42:39
小弟在数据库方面很鄙视自己,很鄙视......

现在又遇到问题了,希望有大侠们不吝赐教

是这样

我要批量向一个表A里插入一些记录

但是这个表里有一个字段比较特殊,叫邮政编码,要插入的记录中预先是没有这个属性的。

只有一个属性叫电话号码,我要根据电话号码查询一个码表,去读这个电话所在地的邮编,然后更新到A表的记录中

但是这样做就等于分了2步

第一步,我向A表插入记录

第二步,查询刚才插入的所有记录的电话号码,然后查询码表,把邮编更新到对应字段上。

而且,有的电话比如是网络电话打进来的,根本没邮编。所以这种记录的邮编字段就空着。

我想用一条SQL语句用批量插入的方式直接插进去

但是没找到支持这么做的方法

比如

INSERT INTO A (COLUMNS) VALUES (

SELECT 邮编 FROM 码表
)

这样做貌似是因为里面的SELECT查询Oracle不能保证返回一条记录

所以没法做插入。


想问问高手有没有用一条语句就做到的啊?
...全文
177 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolkisses 2010-11-26
  • 打赏
  • 举报
回复
说了半天,楼主是业务需要,还是自己研究?
只要这张表不是很大,分两步解决就可以了。
如果是自己写一堆inser into (value),那以上那些语句,就算给条件了又如何,还不是要分成100个 1000价目insert?
maxtomb 2010-11-26
  • 打赏
  • 举报
回复
一个电话不能对应多个邮政编码吧?
select 邮政编码 from postTable p where p.telno in (select telno from teltable)
那这句肯定就是 返回一个值了。那就可以写在VALUES里了。
maxtomb 2010-11-26
  • 打赏
  • 举报
回复
用这句!
insert into A(postno) select 邮政编码 from postTable p where p.telno in (select telno from teltable);
kingkingzhu 2010-11-26
  • 打赏
  • 举报
回复
insert into c(a,b) select a.a,b.b from a,b where a.a=b.a;
类似语法

分2步走也不错啊
maxtomb 2010-11-26
  • 打赏
  • 举报
回复
兄弟 你这个用存储过程作比较好,因为涉及业务逻辑
给你的代码如下 首先你需要把所有的电话号码 从EXCEL复制到 数据的表里,如果你数据库里直接有这个电话号码表的话 那最好不过了。

代码如下

declare
--telTable 就是存放电话号码的那张表
cursor cur is select telno from telTable; --将电话号码表中数据存到游标里。
vPostNo varchar2;
vTelNo varchar2;
i integer;
begin
open cur;
loop
fetch cur into vTelNo; --遍历游标 取出电话号码
exit when cur%notfound;
select POSTNO into vPostNo from POSTTABLE where TELNO=vTelNo; --根据电话从邮编表中找出邮编
insert into A(POSTNO) values(vPostNo);--将邮编插入到A表中 你改的时候改这句就行。
end loop;
close cur;
end;




wyx100 2010-11-24
  • 打赏
  • 举报
回复
merge INTO tbA k using (select b.邮编 from 电话表 a,码表 b where a.关联字段=b.关联字段) t on (k.关联=t.关联 and rownum=1)
when not matched then
insert(a.COLUMNS) values(t.邮编)

speedin 2010-11-22
  • 打赏
  • 举报
回复
我觉得使用一个嵌套查询就OK了吧,如果有多条记录的话,对查出来的记录按照自己的需求进行排序,取一条就行了。
suhenhappy 2010-11-22
  • 打赏
  • 举报
回复
观看中。。。。
YY_MM_DD 2010-11-22
  • 打赏
  • 举报
回复

------Oracle支持批量插入的功能,你可以模仿这个语句,修改下,可以满足你的需求。good luck!
INSERT ALL
WHEN type=1 THEN INTO tab1 VALUES (myseq.NEXTVAL, val)
WHEN type=2 THEN INTO tab2 VALUES (myseq.NEXTVAL, val)
WHEN type IN (3,4,5) THEN INTO tab3 VALUES (myseq.NEXTVAL, val)
ELSE INTO tab4 VALUES (myseq.NEXTVAL, val)
SELECT type, val FROM source_tab;
clarck_913 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dawugui 的回复:]
这样做貌似是因为里面的SELECT查询Oracle不能保证返回一条记录

--如果是这样,你需要决定哪条记录是你需要的?不可能你多条都需要吧?
[/Quote]


对对,我就是说,我不知道用SQL如何去指定我要的是哪条记录

其实我可以保证查询到的就是一条结果或者没有结果。

但是不知道这样的SQL怎么写
心中的彩虹 2010-11-22
  • 打赏
  • 举报
回复
merge INTO tbA k using (select b.邮编 from 电话表 a,码表 b where a.关联字段=b.关联字段) t on (k.关联=t.关联 and rownum=1)
when not matched then
insert(a.COLUMNS) values(t.邮编)
dawugui 2010-11-22
  • 打赏
  • 举报
回复
这样做貌似是因为里面的SELECT查询Oracle不能保证返回一条记录

--如果是这样,你需要决定哪条记录是你需要的?不可能你多条都需要吧?

最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

jufeng2309 2010-11-22
  • 打赏
  • 举报
回复


insert into (columns)

SELECT 邮编 FROM(
SELECT 邮编,count(1) FROM 码表
group by 邮编 having count(1)<=1)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧