Sql-Server

如何遍歷所有表行並使用同一行的值執行子查詢?

  • September 3, 2019

我的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列並將值插入列valAvalB. 我有一個執行此操作的查詢,但我只知道如何通過指定行的參考號來執行此操作:

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和/或valBNULL 的值 - 如果不是,則該記錄之前已經處理過。例如UPDATE ... WHERE valA IS NULL(測試欄位上的索引會有所幫助)。如果某些列在處理後可能仍為空,則最好將其設置為某個非 NULL 值(例如,空字元串或單個空格)。

引用自:https://dba.stackexchange.com/questions/246831