Sql-Server
如何遍歷所有表行並使用同一行的值執行子查詢?
我的
table
結構如下:| reference | valA | valB | xml | 1 NULL NULL <xml stuff> 3 NULL NULL <xml stuff> 4 NULL NULL <xml stuff> 6 NULL NULL <xml stuff>
我的目標是解析
xml
列並將值插入列valA
和valB
. 我有一個執行此操作的查詢,但我只知道如何通過指定行的參考號來執行此操作:UPDATE table SET valA = (SELECT xml.value(_parsing queryA_) FROM table WHERE reference = N), valB = (SELECT xml.value(_parsing queryB_) FROM table WHERE reference = N) WHERE reference = N;
我需要能夠遍歷表中的每一行,並根據該行中的值在每一行中執行相同的查詢。所以這個的虛擬碼是:
UPDATE table SET valA = (SELECT xml.value(_parsing queryA_) FROM current row), valB = (SELECT xml.value(_parsing queryB_) FROM current row) in current row;
我目前正在以一種尷尬的方式執行此操作,方法是在我的主程序(C++)中實現這個循環,首先讀取數組中的每個引用,然後循環遍歷數組以獲取引用號並將其設置在查詢中
N
代替上面的範例查詢。我對 SQL 很陌生,所以我不知道我是否讓這變得比現在更複雜,以及是否有一種簡單的方法可以做到這一點。
我已經執行這個操作很多小時(表中大約有 164,000 行),所以我有一個部分更新的表。
根據Akina最初留下的評論回答
UPDATE table SET valA = xml.value(_parsing queryA_), valB = xml.value(_parsing queryB_)
當您在賦值表達式(在您的情況下為解析表達式)的右側使用列名時,它被引用到目前正在更新的同一記錄中的列值(如果您想考慮類似的更新是一個逐個記錄的過程)。它始終是相同的行欄位。引用另一行中的列總是更複雜(需要視窗函式或對錶的另一個引用)。
要繼續處理部分更新的內容,您可以添加
WHERE reference > last_ref
到. 您的條款將決定是否更新每條記錄。SET``UPDATE``WHERE
更好的方法可能是檢查
valA
和/或valB
NULL 的值 - 如果不是,則該記錄之前已經處理過。例如UPDATE ... WHERE valA IS NULL
(測試欄位上的索引會有所幫助)。如果某些列在處理後可能仍為空,則最好將其設置為某個非 NULL 值(例如,空字元串或單個空格)。