Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Таинственный рекурсивный SQL запрос


Автор: polin11 26.4.2018, 18:49
Таинственный рекурсивный SQL запрос

Я плохо понимаю логику рекурсивных запросов, есть запрос

Код

UPDATE "Table" main_table 
SET 
   "Field1" = 
   (
      WITH RECURSIVE
      Hier("Field2", "Fileld3", "Fileld4")
      AS
      (
         SELECT 1 AS "Field2", "Fileld3", "Fileld4"
         FROM "Table" t1 
            WHERE t1."Fileld3" = main_table."Fileld3"        
         UNION ALL
         SELECT h."Field2" + 1 AS "Field2", k2."Fileld3", k2."Fileld4" FROM  "Table" t2
            INNER JOIN Hier h ON ( t2."Fileld3" = h."Fileld4" )
      )
      SELECT h."Field2" FROM Hier h WHERE h."Fileld4" <> 1 LIMIT 1 
   )
   ,
   "Fileld4" = 
   (
      WITH RECURSIVE
      Hier("Fileld3", "Fileld4")
      AS
      (
         SELECT "Fileld3", "Fileld4"
         FROM "Table" t1 
            WHERE t1."Fileld3" = main_table."Fileld3"                
         UNION ALL
         SELECT t2."Field2", t2."Fileld4" FROM "Table" t2 
            INNER JOIN Hier h ON ( t2."@Fileld3" = h."Fileld4" )
      )
      SELECT COUNT(*) FROM Hier
   )


Можно ли вынести стартовую часть рекурсии, то есть сделать что-то типа этого?
Код

WITH my("Fileld3", "Fileld4") as
(
  SELECT  t1."Fileld3", t1."Fileld4"
         FROM "Table" t1
         INNER JOIN "Table" t2 
         ON (t1."Fileld3" = t2."Fileld3")
)
UPDATE "Table" main_table 
SET 
   "Field1" = 
   (
      WITH RECURSIVE
      Hier("Field2", "Fileld3", "Fileld4")
      AS
      (
         SELECT 1 AS "Field2", "Fileld3", "Fileld4"
         FROM my
         UNION ALL
         SELECT h."Field2" + 1 AS "Field2", k2."Fileld3", k2."Fileld4" FROM  "Table" t2
            INNER JOIN Hier h ON ( t2."Fileld3" = h."Fileld4" )
      )
      SELECT h."Field2" FROM Hier ht WHERE ht."Fileld4" <> 1 LIMIT 1 
   )
   ,
   "Fileld4" = 
   (
      WITH RECURSIVE
      Hier("Fileld3", "Fileld4")
      AS
      (
         SELECT "Fileld3", "Fileld4"
         FROM my
         UNION ALL
         SELECT t2."Field2", t2."Fileld4" FROM "Table" t2 
            INNER JOIN Hier h ON ( t2."@Fileld3" = h."Fileld4" )
      )
      SELECT COUNT(*) FROM Hier
   )

Можно ли верхний запрос заменить нижним?

Автор: polin11 26.4.2018, 20:11
Насколько я поминаю так делать нельзя, тогда другой вопрос 
можно каким-либо образом вынести стартовую часть рекурсии, чтобы вычислялась 1 раз, для обновления 2 полей? 

Автор: Akina 27.4.2018, 07:32
Ну вообще-то не то что можно, а где-то даже нужно. Вот только у тебя и рекурсивные части различны, а пытаться понять, что там такого понаверчено и зачем, тупо лень.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)