【问题标题】:How can I update my inner joins results?如何更新我的内部连接结果?
【发布时间】:2016-01-18 12:16:33
【问题描述】:

我有两张桌子:

  1. 地址(有 1000+ 行)
  2. GoverningBody,(只有 7 个)

dbo.GoverningBody 使用 dbo.Address.AddressID 链接(唯一 ID)

我想更新所有address1 列(来自dbo.Address),其中 dbo.address.addressID =dbo.governingbody.addressID 在我的内部连接中:

SELECT 
    GB.GoverningBodyName,
    Ad.Address1,
    Ad.AddressID,
    GB.GoverningBodyID
FROM
    Address Ad
INNER JOIN 
    (SELECT 
         GoverningBodyID,
         AddressID,
         GoverningBodyName
     FROM   
         GoverningBody) GB ON ad.AddressID = gb.AddressID 

我想将Address1 值更新为:

'Test1','Test2','Test3' etc...

希望这是有道理的。

谢谢,

山姆

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql stored-procedures


    【解决方案1】:
    CREATE SEQUENCE testSEQ
    AS INT
    START WITH 1
    INCREMENT BY 1 
    CYCLE;
    GO
    
    Update Ad
    Set Address1 = 'Test' + cast(NEXT VALUE FOR testSEQ as varchar)
    From Address Ad
    Inner Join GoverningBody GB on ad.AddressID = gb.AddressID
    

    【讨论】:

    • 如何同时更改多个值?我不希望他们都一样,我希望他们不同。
    • 多行或多列?
    • 只是 Address1 列。
    • 嗨,Rusland,非常感谢,但是,它似乎不起作用。我收到一个错误' Unknown object type 'SEQUENCE' used in a CREATE, DROP, or ALTER statement.' 另外,如何将其更新为“伦敦”、“曼彻斯特”等。
    • 您使用什么版本的 SQL SERVER?
    【解决方案2】:

    SQL Server 2008 有ROW_NUMBER 函数。

    我会将您的查询包装到一个 CTE(公用表表达式)中,其中包含一个额外的行号列并更新 CTE。您可以在ROW_NUMBER 函数中使用ORDER BY 来确定如何将数字分配给行。

    顺便说一句,您的INNER JOIN 并不需要子查询,它可以写成更简单的形式。优化器足够聪明,可以只读取那些需要的列。事实上,在 UPDATE 查询中,您不需要 GoverningBodyName 和 GoverningBodyID 列,而且很可能优化器不会读取它们。

    WITH
    CTE
    AS
    (
        SELECT 
            GB.GoverningBodyName,
            Ad.Address1,
            Ad.AddressID,
            GB.GoverningBodyID,
            ROW_NUMBER() OVER (ORDER BY Ad.AddressID) AS rn
        FROM
            Address AS Ad
            INNER JOIN GoverningBody AS GB ON ad.AddressID = gb.AddressID
    )
    UPDATE CTE
    SET Address1 = 'Test' + CAST(rn as varchar(10))
    ;
    

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      相关资源
      最近更新 更多