我有这三个表:
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
答案 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
子句来限制它只根据我们的需要获得有限数量的行