"Александр Свириденков" ...
В RN написано что нерекурсивные CTE могут иcпользоваться в подзапросах
Update/Insert/Delete.
А что насчет рекурсивных? И какой тогда синтаксис?

На
with recursive a as (...) update ... ругается

   Такой синтаксис не поддерживается

на update ... where .. in (with recursive ...) тоже

   С IN что-то не доделали в парсере. С EXISTS работает :

UPDATE DIRECTORY SET DIRNAME = DIRNAME || '_2'
WHERE EXISTS (

 WITH RECURSIVE
   TREE AS (
     SELECT D.DIRID, D.DIRNAME, D.PARENTDIR, CAST(0 AS INT) AS LVL
       FROM DIRECTORY D
      WHERE D.PARENTDIR IS NULL

     UNION ALL

     SELECT D.DIRID, D.DIRNAME, D.PARENTDIR, LVL + 1
       FROM DIRECTORY D, TREE T
      WHERE D.PARENTDIR = T.DIRID
   )

 SELECT * FROM TREE
  WHERE LVL = 2
    AND TREE.DIRID = DIRECTORY.DIRID
)

но я не советую ;) Подзапрос будет вычисляться для каждой строки DIRECTORY

   Лучший способ - MERGE :

MERGE INTO DIRECTORY
 USING (
         WITH RECURSIVE
           TREE AS (
             SELECT D.DIRID, D.DIRNAME, D.PARENTDIR, CAST(0 AS INT) AS LVL
               FROM DIRECTORY D
              WHERE D.PARENTDIR IS NULL

             UNION ALL

             SELECT D.DIRID, D.DIRNAME, D.PARENTDIR, LVL + 1
               FROM DIRECTORY D, TREE T
              WHERE D.PARENTDIR = T.DIRID
           )

         SELECT * FROM TREE
          WHERE LVL = 2
        ) AS TREE

    ON TREE.DIRID = DIRECTORY.DIRID

 WHEN MATCHED THEN
  UPDATE SET DIRNAME = DIRNAME || '_2'


--
Хорсун Влад

Ответить