【问题标题】:Is there any better way to write an UPDATE query against the resulting table after a JOIN (SQL-server)?在 JOIN(SQL 服务器)之后,有没有更好的方法来针对结果表编写 UPDATE 查询?
【发布时间】:2024-04-15 12:35:02
【问题描述】:

我有这些表:

我写了以下查询:


    UPDATE a
    SET a.AlbumTitle = 'An updated title!'

    FROM albums AS a
    JOIN RecordCompanies AS r
    ON a.RecordLabel = p.RCompanyId
    JOIN Singer AS s
    ON s.SingerId = a.Id_Author  


    UPDATE s
    SET s.SingerName = 'Updating the author too!'    

    FROM albums AS a
    JOIN RecordCompanies AS r
    ON a.RecordLabel = p.RCompanyId
    JOIN Singer AS s
    ON s.SingerId = a.Id_Author  


    UPDATE r
    SET r.RCompanyName = 'Updated RCompanyName too!'    

    FROM albums AS a
    JOIN RecordCompanies AS r
    ON a.RecordLabel = p.RCompanyId
    JOIN Singer AS s
    ON s.SingerId = a.Id_Author  


有没有更好的方法通过使用单个查询来实现?如何改进我的查询?

【问题讨论】:

  • SQL Server 只允许您在单个 update 查询中一次更新一个表。所以你仍然需要多个查询。
  • 一个 DML 语句不能影响多个表,不。由于这些都是非常困难的列和表,你正在影响,那么你将需要 3 UPDATEstatements。
  • 嗨@Larnu。所以我的解决方案是正确的?
  • @Gordon Linoff:我可以对 JOIN 操作的结果执行单个 UPDATE 查询吗?
  • 假设您具有参照完整性,所有这些额外的JOIN 约束都是多余的。例如,第一个 UPDATE 只是用相同的值更新每条记录,对吗?因此,您可以通过删除所有这些连接来改进您的查询...假设您当前只是更新每条记录

标签: sql sql-server database tsql


【解决方案1】:

正如 cmets 所述,没有办法在单个语句中执行此操作。我将尝试回答“如何改进我的查询”的问题。

现在,您的联接是不必要的,因为没有 WHERE 子句,所有记录都将被更新。我也看不到你需要同时更新所有三个表的真实场景,但只要你确保你的 ID 值是可靠的,下面的内容应该更容易理解。

declare @singerID int
declare @albumID int
declare @companyID int

select
    @singerID = SingerID,
    @albumID = AlbumID,    
    @companyID = CompanyID
from
    Albums as A
    join Singer as S
        on A.Id_Author = S.SingerID
    join RecordCompanies as C
        on A.RecordLabel = C.RCompanyID
where
    A.AlbumTitle = 'OldAlbum'

update Albums set AlbumTitle = 'NewTitle' where AlbumID = @albumID
update Singer set SingerName = 'New Author' where SingerID = @singerID
update RecordCompanies set RCompanyName = 'New Company' where RCompanyID = @companyID

【讨论】: