SQL语句:更新问题

时间:2015-08-10 05:22:38

标签: oracle sql-update

我有这三个表:

RESEARCHER(Re_Id, Re_Name, Re_Address, Re_Phone, Re_HomePhoneNumber,
Re_OfficeNumber, Re_FirstScore, Re_Second_Score)

PUBLICATION(Pub_ID, Pub_Title, Pub_Type, Pub_Publisher, Pub_Year,Pub_Country, Pub_StartingPage, Pub_Number_of_Page, Score1, Score2)

WRITTEN_BY(Re_Id, Pub_ID)

我想将出版物“数据库系统简介”的作者更改为“Henry Gordon”“Sarah Parker”

问题出在 WRITTEN_BY 表中,我只存储了研究员的ID 发布的ID

我的想法是更改 WRITTEN_BY 中的 Re_Id ,这些名称是" Henry Gorgon " ," Sarah Parker " ,已存在于 RESEARCHER

UPDATE WRITTEN_BY
SET Re_Id = ....( SELECT Re_Id
                  FROM RESEACHER
                  WHERE Re_Name = ‘Henry Gordon’ OR Re_Name = ‘Sarah Paker’ )
WHERE Pub_ID IN ( SELECT Pub_ID
                   FROM PUBLICATION
                   WHERE Pub_Name = ‘Introduciton to Database system’ );

我在SET部分有问题,那么如何为该要求编写SQL语句? 以下是我的架构的sqlfiddle链接:http://sqlfiddle.com/#!9/b9118/1

1 个答案:

答案 0 :(得分:1)

我会使用以下查询:

DELETE FROM WRITTEN_BY WHERE Pub_ID IN (
SELECT Pub_ID FROM PUBLICATION
                   WHERE Pub_Title = 'Introduciton to Database system' )

INSERT INTO WRITTEN_BY 
SELECT Re_Id,Pub_Id
FROM RESEARCHER CROSS JOIN PUBLICATION 
WHERE Re_Name = 'Henry Gordon' OR Re_Name = 'Sarah Paker' 
AND Pub_Title like 'Introduciton to Database system'

SELECT * FROM WRITTEN_BY

我们的想法是首先删除现有的映射 - 你不应该更新它 - 并插入一个新映射。

在映射表的情况下删除/插入方法与更新的原因是合理的,有利于删除/插入,因为大多数映射表包含许多映射,通常是一对多映射。

最初,我们可能会将一本书映射为n个作者,其中n<> 1然后我们要么添加额外的行,要么留下无关的行。

请参阅示例小提琴:http://sqlfiddle.com/#!6/a0e72/13

真正的交易是CROSS JOIN。这不会像其他ON一样使用JOIN,而是用于生成笛卡尔积产品类型。 我们通过添加合适的WHERE子句来限制它只根据我们的需要获得有限数量的行