代码之家  ›  专栏  ›  技术社区  ›  War

SQL我如何像这样更新?

  •  2
  • War  · 技术社区  · 14 年前

    我正在尝试更新[Temp\u LTGData]表中的所有SQL行,将[CORP\u REG\u NO]值设置为[CUSTOMER\u NUMBER]匹配的同一表中另一行的值。

    最终,我需要用相当多的专栏来做这件事,有人知道这是否可以做到吗?

    我似乎不能像在select查询中那样使用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
    

    3 回复  |  直到 12 年前
        1
  •  2
  •   Mitchel Sellers    14 年前

    尝试下面的方法来获得你正在做的事情

    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
    

        2
  •  2
  •   gbn    14 年前

    类似这样的内容允许您处理具有源行和目标行的许多列

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

    如果我理解正确,过滤到 CORP_REG_NO IS NULL

    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
    
        3
  •  1
  •   shsteimer    14 年前

    试试这个:

    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