【求sql语句】把1个表中的数据分开插入到3个表中

fihuang 2009-04-23 11:30:16
数据库中一个表里存有数据:
table_QuestionAndAnswer(4列):id(主键)、question、answer、isStored(表示是否被存入到另外三个表中,已存入是1,没有存入是0)
另外三个表:
table_Question(2列):id(主键,触发器生成)、question
table_Answer(2列):id(主键,触发器生成)、answer
table_Relation(3列):id(主键,触发器生成)、question_id(外键,对应table_question的id)、answer_id(外键,对应table_answer的id)

我现在要做的是:把第一个表(table_QuestionAndAnswer)中isStored=0的数据存进后面三个表(table_Question、table_Answer、table_Relation)中,并将isStored改为1。

请教大家sql语句怎么写?
万分感谢!
...全文
278 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jin_ok 2009-04-24
  • 打赏
  • 举报
回复
路过
fihuang 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Jane_64 的回复:]
insert table_Question(question)
select question from table_QuestionAndAnswer where sStored = 0;

insert table_Answer(answer)
select answer from table_QuestionAndAnswer where sStored = 0;

insert table_Relation(question_id,answer_id)
select table_Question.id,table_Answer.id
from table_QuestionAndAnswer,table_Question,table_Answer
where sStored = 0
and table_QuestionAndAnswer.question = table_Question.question
and table_QuestionAndAnswer.answer = table_answer.answer;

update table_QuestionAndAnswer
set sStored = 1
where sStored = 0;

commit;


注:最准确的是在table_Question和table_Answer表中加一列QuestionAndAnswer_id对应table_QuestionAndAnswer的id[/Quote]

insert table_Relation(question_id,answer_id)
select table_Question.id,table_Answer.id
from table_QuestionAndAnswer,table_Question,table_Answer
where sStored = 0
and table_QuestionAndAnswer.question = table_Question.question
and table_QuestionAndAnswer.answer = table_answer.answer;
你这样有一个问题,question和answer不唯一,id才是唯一的。
有没有更好的方法呢?
Jane_64 2009-04-23
  • 打赏
  • 举报
回复
insert table_Question(question)
select question from table_QuestionAndAnswer where sStored = 0;

insert table_Answer(answer)
select answer from table_QuestionAndAnswer where sStored = 0;

insert table_Relation(question_id,answer_id)
select table_Question.id,table_Answer.id
from table_QuestionAndAnswer,table_Question,table_Answer
where sStored = 0
and table_QuestionAndAnswer.question = table_Question.question
and table_QuestionAndAnswer.answer = table_answer.answer;

update table_QuestionAndAnswer
set sStored = 1
where sStored = 0;

commit;


注:最准确的是在table_Question和table_Answer表中加一列QuestionAndAnswer_id对应table_QuestionAndAnswer的id
chenqingyu 2009-04-23
  • 打赏
  • 举报
回复
SQL> INSERT ALL
2 WHEN (OBJECT_TYPE = 'TABLE') THEN
3 INTO TABLE_ALL VALUES (OBJECT_NAME)
4 WHEN (OBJECT_TYPE = 'INDEX') THEN
5 INTO INDEX_ALL VALUES (OBJECT_NAME)
6 ELSE
7 INTO OBJECT_OTHER
8 SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS
9 ;

参考这个
IT农夫 2009-04-23
  • 打赏
  • 举报
回复
用PL/SQL
在插入table_Question时候,把触发器生成的ID保存

Declare
vqid int;
vq varchar2(100);
vaid int;
va varchar2(100);

BEGIN
--对table_QuestionAndAnswer的记录循环,作如下处理:
--1,
insert into table_Question(question) values('q1')
RETURNING id, question
INTO vqid , vq ;
--2,
insert into table_Answer(answer ) values('a1')
RETURNING id, question
INTO vaid, va ;

--insert into table_Relation(vqid ,vaid );

END;
fihuang 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kkdelta 的回复:]
1,建议在这两个表table_Question,table_Answer中增加一个qaid列,把第一个表的id更新过来。
2,根据qaid列插入table_Relation。
3,删掉table_Question,table_Answer中增加的qaid列
[/Quote]后面3个表不是我的,我不能修改者3个表的结构!
kk19840210 2009-04-23
  • 打赏
  • 举报
回复
在表 table_QuestionAndAnswer 上创建一个
UPDATE 触发器
在触发器内部用

INSERT ALL
WHEN (OBJECT_TYPE = 'TABLE') THEN
INTO TABLE_ALL VALUES (OBJECT_NAME)
WHEN (OBJECT_TYPE = 'INDEX') THEN
INTO INDEX_ALL VALUES (OBJECT_NAME)
ELSE
INTO OBJECT_OTHER
SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS
同时插入多表的方法 从 触发器内部找到修改的数据 插入3个表
IT农夫 2009-04-23
  • 打赏
  • 举报
回复
如果表结构不能改的话
1,建两个临时表,(qaid是第一个表的id),在触发器里同时查入记录到临时表
tmp_table_Question(id(主键,触发器生成)、question,qaid)
tmp_table_Answer(id(主键,触发器生成)、answer,qaid)

2,根据临时表插入table_Relation
IT农夫 2009-04-23
  • 打赏
  • 举报
回复
1,建议在这两个表table_Question,table_Answer中增加一个qaid列,把第一个表的id更新过来。
2,根据qaid列插入table_Relation。
3,删掉table_Question,table_Answer中增加的qaid列
fuyou001 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fihuang1 的回复:]
马甲上来顶 up
[/Quote]
帮你顶顶吧
fihuang1 2009-04-23
  • 打赏
  • 举报
回复
马甲上来顶 up
fihuang 2009-04-23
  • 打赏
  • 举报
回复
我顶
fihuang 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 superhsj 的回复:]
如果表结构还可以修改的话,建议在这两个表中增加一个id列,把第一个表的id更新过来,否则这3个表很难完全准确的建立起联系
[/Quote]其实第一个表只是一个过度,只要把第一个表里的数据填到后面3个表里就可以,至于之后能不能关联起来,这个是无所谓的!
我实在没辙了!
up
superhsj 2009-04-23
  • 打赏
  • 举报
回复
如果表结构还可以修改的话,建议在这两个表中增加一个id列,把第一个表的id更新过来,否则这3个表很难完全准确的建立起联系
fihuang 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 superhsj 的回复:]
table_Question 和table_Answer的主键不用自动生成了,就用表table_QuestionAndAnswer的主键就可以吧
[/Quote]没办法 这两个表是后来建的,里面已经有别的数据了,没办法用表table_QuestionAndAnswer的id。
哎!真不知道怎么办好!在线等待csdn前辈解答!
superhsj 2009-04-23
  • 打赏
  • 举报
回复
table_Question 和table_Answer的主键不用自动生成了,就用表table_QuestionAndAnswer的主键就可以吧
fihuang 2009-04-23
  • 打赏
  • 举报
回复
前辈们啊 帮我看看吧

17,377

社区成员

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

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