"Александр Свириденков" ...
В 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'
--
Хорсун Влад