Синтаксис postgresql пока существует цикл - PullRequest
3 голосов
/ 04 мая 2010

Я работаю над функцией из книги Джо Селкоса - Деревья и иерархии в SQL для умников

Я пытаюсь удалить поддерево из списка смежности, но часть моя функция еще не работает.

WHILE EXISTS –– mark leaf nodes
   (SELECT *
      FROM OrgChart
     WHERE boss_emp_nbr = −99999
       AND emp_nbr > −99999)
  LOOP –– get list of next level subordinates
     DELETE FROM WorkingTable;
     INSERT INTO WorkingTable
     SELECT emp_nbr FROM OrgChart WHERE boss_emp_nbr = −99999;
  –– mark next level of subordinates
     UPDATE OrgChart
        SET emp_nbr = −99999
      WHERE boss_emp_nbr IN (SELECT emp_nbr FROM WorkingTable);
 END LOOP;

мой вопрос: является ли WHILE EXISTS правильным для использования с postgresql? Я, кажется, спотыкаюсь и попадаю в бесконечный цикл в этой части. Возможно, есть более правильный синтаксис, о котором я не знаю.

Ответы [ 2 ]

1 голос
/ 04 мая 2010

Использование WHILE EXISTS (...) нормально, поскольку EXISTS (...) является логическим оператором SQL.

Трудно увидеть, что вы на самом деле пытаетесь сделать (это лучше не делать рекурсивным запросом), но я думаю, что ваша логика неверна: например, таблица, содержащая одну строку с (emp_nbr = 1, boss_emp_nbr = -99999) вызовет бесконечный цикл, поскольку он постоянно пытается обновить все записи, где (boss_emp_nbr в (1)) имеет значение emp_nbr = -99999 (без эффекта).

0 голосов
/ 04 мая 2010

Поскольку WHILE принимает логическое выражение и передает его в механизм SQL, вопрос заключается в том, будет ли это допустимым оператором SELECT. Кажется, так и должно быть, но на всякий случай вы можете перефразировать условие примерно так:

WHILE (SELECT count(*) FROM OrgChart WHERE boss_emp_nbr=09999 AND emp_nbr > -99999) > 0 LOOP

Случайно, бесконечный цикл может иметь больше общего с ОБНОВЛЕНИЕМ OrgChart, но для этого было бы полезно иметь структуру таблицы и объяснение того, что именно вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...