2012-06-26 41 views
0

我試圖根據TableB更新TableA中的ColumnA。以下是我需要循環更新TableA的結果集。在sql查詢循環中執行更新

SELECT TableB.ColumnA, 
     TableB.ColumnB 
    FROM TableA, TableB 
WHERE TableA.ColumnA =NULL 
    AND TableB.ColumnB = TableA.ColumnB 
    AND TableB.ColumnC =true; 

CoulmnA兩個表中是相同的類型和數據 ColumnB兩個表中是相同的類型和數據。

我不能做的就是通過類似的FASION結果集和更新表A下面寫循環:

在結果中的每一行的上方設置。

UPDATE TableA 
    SET ColumnA = ResultSet.ColumnA 
WHERE TableA.ColumnB = ResultSet.ColumnB; 
+0

你必須循環嗎?你不能僅僅使用你寫的查詢作爲更新的基礎,並且一次完成所有的事情? –

+0

我不知道如何?你能解釋一下嗎?謝謝 –

+0

請參閱戈登的回答下面的 –

回答

1

這是我會怎麼寫在SQL Server和看SYBASE語法,它看起來好像也可能工作。

UPDATE A  
SET ColumnA = B.ColumnB 
--SELECT ColumnA , B.ColumnB 
FROM tableA A 
JOIN TableB B 
ON B.ColumnB = A.ColumnB    
WHERE A.ColumnA = NULL AND B.ColumnC =true; 

注意我把註釋行放在裏面,這樣你可以在運行之前看到實際值,以確保更新是正確的。它還顯示如何將select語句轉換爲更新。

+0

注意我刪除了隱式連接,他們區域SQL反模式。 – HLGEM

+0

太棒了,這工作正常。非常感謝你 –

3

如果我理解正確,您使用查詢生成的對用於更新目的。你想要第一個值變成第二個值。

確切的語法取決於您使用的SQL版本。下面是SQL Server的一個例子:

with toupdate as (SELECT TableB.ColumnA, TableB.ColumnB 
        from TableA join TableB 
         TableB.ColumnB = TableA.ColumnB 
        where TableA.ColumnA = NULL AND TableB.ColumnC =true 
       ) 
update tableA 
    set TableA.ColumnA = toupdate.ColumnB 
    from toupdate 
    where toupdate.ColumnA = tableA.columnA 

沒有一個 「with」 語句,你可以嘗試:

update tableA 
    set TableA.ColumnA = toupdate.ColumnB 
    from (SELECT TableB.ColumnA, TableB.ColumnB 
      from TableA join TableB 
       TableB.ColumnB = TableA.ColumnB 
      where TableA.ColumnA = NULL AND TableB.ColumnC =true 
     ) toupdate 
    where toupdate.ColumnA = tableA.columnA 
+0

對不起,我使用sybase而不是sql server。感謝您的答覆。我正在尋找類似於Sybase的某些條目 –

+1

Sybase是非常類似的SQL服務器,邏輯應該大體相同 - 請嘗試一下。 –

+0

我嘗試了上面的邏輯,並說,語法問題,關鍵字'WITH'附近的語法錯誤。 Msg:156,級別:15,狀態:2 服務器:SYBASEN20,行:1 –