SQL声明:更新问题
SQL Statement : Update issue
我有这三个 tables :
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”和“莎拉·帕克”。
问题出在WRITTEN_BYtable,我只存储了研究员的ID和出版物的ID。
我的想法是将 WRITTEN_BY 中的 Re_Id 更改为“Henry Gorgon" , "Sarah Parker" , 已经存在于 RESEARCHER table
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 link:http://sqlfiddle.com/#!9/b9118/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
我们的想法是先删除现有的映射——你不应该更新它——然后插入一个新的映射。
在映射 table 的情况下,delete/insert 方法与更新的原因有利于 delete/insert,因为大多数映射 table 包含多对多映射,并且通常是一对多映射。
最初我们可能有一本书映射到 n 位作者,其中 n <>1 然后我们要么添加额外的行,要么留下无关的行。
查看示例 fiddle:http://sqlfiddle.com/#!6/a0e72/13
然而,真正的交易是 CROSS JOIN
。这不像其他 JOIN
那样采用任何 ON
,用于生成笛卡尔积类型映射。
我们通过添加 suitable WHERE
子句
将其限制为仅根据需要获取有限数量的行
我有这三个 tables :
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”和“莎拉·帕克”。
问题出在WRITTEN_BYtable,我只存储了研究员的ID和出版物的ID。
我的想法是将 WRITTEN_BY 中的 Re_Id 更改为“Henry Gorgon" , "Sarah Parker" , 已经存在于 RESEARCHER table
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 link:http://sqlfiddle.com/#!9/b9118/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
我们的想法是先删除现有的映射——你不应该更新它——然后插入一个新的映射。
在映射 table 的情况下,delete/insert 方法与更新的原因有利于 delete/insert,因为大多数映射 table 包含多对多映射,并且通常是一对多映射。
最初我们可能有一本书映射到 n 位作者,其中 n <>1 然后我们要么添加额外的行,要么留下无关的行。
查看示例 fiddle:http://sqlfiddle.com/#!6/a0e72/13
然而,真正的交易是 CROSS JOIN
。这不像其他 JOIN
那样采用任何 ON
,用于生成笛卡尔积类型映射。
我们通过添加 suitable WHERE
子句