Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL:Zastąp część kolumny w wielu wierszach na podstawie drugiej tabeli

Oto pojedyncza instrukcja bez kursora, która wykorzystuje CTE:

WITH CTE(iteration, page_id, content) AS (
    SELECT
        0,
        P.page_id,
        REPLACE(P.content, M1.old_value, M1.new_value)
    FROM
        Pages P
    INNER JOIN Moving M1 ON
        P.content LIKE '%' + M1.old_value + '%'
    WHERE
        NOT EXISTS (SELECT * FROM Moving M2 WHERE P.content LIKE '%' + M2.old_value + '%' AND M2.moving_id < M1.moving_id)
    UNION ALL
    SELECT
        CTE.iteration + 1,
        CTE.page_id,
        REPLACE(CTE.content, M3.old_value, M3.new_value)
    FROM
        CTE
    INNER JOIN Moving M3 ON
        CTE.content LIKE '%' + M3.old_value + '%'
    WHERE
        NOT EXISTS (SELECT * FROM Moving M4 WHERE CTE.content LIKE '%' + M4.old_value + '%' AND M4.moving_id < M3.moving_id)
)
UPDATE P2
SET
    content = CTE1.content
FROM
    Pages P2
INNER JOIN CTE CTE1 ON
    CTE1.page_id = P2.page_id AND
    NOT EXISTS (SELECT * FROM CTE CTE2 WHERE page_id = P2.page_id AND CTE2.iteration > CTE1.iteration)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 🆕 Pierwsze spojrzenie na SQL Server 2022 — 5 najlepszych nowych funkcji (dodatkowe 5 funkcji)

  2. Jak zwrócić zduplikowane klucze z dokumentu JSON w SQL Server

  3. Jak sys.dm_exec_describe_first_result_set_for_object działa w programie SQL Server

  4. Znajdź ostatnio wstawiony rekord MS SQL SERVER

  5. SQL Server - oblicz czas, jaki upłynął między dwoma znacznikami daty i godziny w formacie GG:MM:SS