SQL如何像这样更新?

时间:2010-07-02 13:40:00

标签: sql tsql sql-update

我正在尝试更新[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

感谢那些非常棒的反馈人员,我甚至学会了一些解决这个问题的方法(投票给大家)。

3 个答案:

答案 0 :(得分:2)

尝试以下操作以准确了解您的操作

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。

答案 1 :(得分:2)

这样的东西可以让你处理包含源和目标行的许多列

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

如果我理解正确,过滤到CORP_REG_NO IS NULL当然只适用于CORP_REG_NO,因此您不想过滤,除非根据您的问题限制目标和源行,而不依赖于特定的列过滤器。< / p>

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

答案 2 :(得分:1)

试试这个:

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 

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