Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таинственный рекурсивный SQL запрос 
:(
    Опции темы
polin11
Дата 26.4.2018, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Таинственный рекурсивный 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
   )

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

PM MAIL   Вверх
polin11
Дата 26.4.2018, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Насколько я поминаю так делать нельзя, тогда другой вопрос 
можно каким-либо образом вынести стартовую часть рекурсии, чтобы вычислялась 1 раз, для обновления 2 полей? 
PM MAIL   Вверх
Akina
Дата 27.4.2018, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1102 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.