【问题标题】:SQL How do i update like this?SQL 我如何像这样更新?
【发布时间】:2010-07-02 13:40:00
【问题描述】:

我正在尝试更新 [Temp_LTGData] 表中的所有 SQL 行,将 [CORP_REG_NO] 值设置为 [CUSTOMER_NUMBER] 匹配的同一表中另一行中的值。

最终我需要用相当多的列来做到这一点,有人知道这是否可以做到吗?

我似乎无法像在选择查询中那样使用 LTGSource 别名 :(

 Update [MandS].[dbo].[Temp_LTGData] LTGSource
    Set [CORP_REG_NO] = (SELECT [CORP_REG_NO] 
                           FROM [MandS].[dbo].[Temp_LTGData] 
                          WHERE ([CORP_REG_NO] IS NULL 
                            AND [CUSTOMER_NUMBER] = LTGSource.[CUSTOMER_NUMBER] ))
  where [CORP_REG_NO] IS NULL

感谢大家的反馈,这些东西真的很棒,我什至学到了一些不同的方法来解决这个问题(投票给你们)。

【问题讨论】:

    标签: sql tsql sql-update


    【解决方案1】:

    尝试以下操作以准确了解您在做什么

    UDPATE [MandS].[dbo].[Temp_LTGData] LTGSource 
    SET [CORP_REG_NO] = (SELECT [CORP_REG_NO] 
                         FROM [MandS].[dbo].[Temp_LTGData] 
                         WHERE ([CORP_REG_NO] IS NULL 
                              AND [CUSTOMER_NUMBER] = ToUpdate.[CUSTOMER_NUMBER] )) 
    FROM {MandS].[dbo].[Temp_LTGData] ToUpdate
    where [CORP_REG_NO] IS NULL
    

    但是,您的查询有误,我认为子查询应该是 IS NOT NULL。

    【讨论】:

      【解决方案2】:

      这样的东西可以让您处理具有源行和目标行的许多列

      如果你需要为不同的列链接不同的行,那就更复杂了

      如果我理解正确,过滤到 CORP_REG_NO IS NULL 当然只适用于 CORP_REG_NO 所以你不想过滤,除了根据你的问题限制目标和源行独立于特定列过滤器。

      Update
         target
      Set
         [CORP_REG_NO] = CASE WHEN target.[CORP_REG_NO] IS NULL THEN source.[CORP_REG_NO] ELSE target.[CORP_REG_NO] END,
          ...and again...
      FROM
          [MandS].[dbo].[Temp_LTGData] target
          JOIN
          [MandS].[dbo].[Temp_LTGData] source ON target.[CUSTOMER_NUMBER] = source.[CUSTOMER_NUMBER]
      WHERE
          a filter to restrict rows perhaps
      

      【讨论】:

      • 我不能自己加入这个表,因为这个表中的记录是从远程位置连接 4 个表的结果,我需要运行上面的查询以确保我得到当我将数据拆分回 4 个表进行处理时,不同的记录。否则,这是我通常会采用的方法。话虽如此,简单地添加一个主键然后加入它使生活变得更简单,使其成为最有效的解决方案。
      【解决方案3】:

      试试这个:

      UPDATE Temp_LTGData LTGSource
        SET Col1 = L2.Col1, Col2 = L2.Col2, Col3 = L2.Col3
      FROM LTGSource L1
      JOIN LTGSource L2 ON L2.CORP_REG_NO IS NOT NULL AND L1.CUSTOMER_NUMBER = L2.CUSTOMER_NUMBER
      WHERE L1.CORP_REG_NO IS NULL 
      

      这应该为你做。您正在将可更新表连接到自身,因此您可以访问旧行和新行以进行更新。这样,您可以一次更新多个列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多