2010-07-02 22 views
2

我試圖更新[Temp_LTGData]表中的所有SQL行,將[CORP_REG_NO]值設置爲與[CUSTOMER_NUMBER]匹配的同一表中另一行中的值。SQL我如何更新?

最終我需要用相當多的專欄來做到這一點,有誰知道這是否可以做到?

我似乎不能在選擇查詢:(

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 

感謝您的反饋傢伙這是一些真正真棒東西使用LTGSource別名一樣,我甚至學會了這個問題的一些不同的方法(投爲你所有)。

回答

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 

但是,你有一個錯誤在您的查詢,我相信子查詢應該是非空。

+0

Spot on ... !!! – War 2010-07-02 13:53:27

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 

這應該爲你做它。您將自己加入可更新表中,以便您可以訪問舊行和新行以進行更新。這樣,您可以一次更新多個列。

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 
+0

+1不錯的別名 – 2010-07-02 13:46:57

+0

我無法自己加入此表,因爲此表中的記錄是從遠程位置跨4個表進行連接的結果,所以我需要運行上面的查詢以確保我得到清晰記錄將數據分割回4個表中進行處理。 否則,這是我通常採取的方法。 話雖如此,它使簡單的生活變得簡單,只需添加一個主鍵,然後加入,使這是最有效的解決方案。 – War 2010-07-02 14:15:15