Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
UPDATE без CASE
|
|||
|---|---|---|---|
|
#18+
Как вот это сделать без CASE'a ... UPDATE Personnel SET lft = CASE WHEN lft BETWEEN droplft AND droprgt THEN lft - 1 WHEN lft > droprgt THEN lft - 2 ELSE lft END rgt = CASE WHEN rgt BETWEEN droplft AND droprgt THEN rgt - 1 WHEN rgt > droprgt THEN rgt -2 ELSE rgt END; WHERE lft > droplft; END; ... CREATE TABLE Personnel (emp CHAR (10) PRIMARY KEY, salary DECIMAL (8,2) NOT NULL CHECK (salary >= 0.00), lft INTEGER NOT NULL UNIQUE CHECK(lft > 0), rgt INTEGER NOT NULL UNIQUE CHECK(rgt > 0), CHECK (lft < rgt)); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2002, 14:23 |
|
||
|
UPDATE без CASE
|
|||
|---|---|---|---|
|
#18+
А чем собственно CASE не устраивает (если он работает как надо)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 03:30 |
|
||
|
UPDATE без CASE
|
|||
|---|---|---|---|
|
#18+
Дело в том, что это MS SQL конструкция, а мне надо хотя бы близко к стандарту. У меня FireBird стоит, а там таких "подпрыжек" нет. Таблица такая CREATE TABLE CLASS ( CLASSID INTEGER NOT NULL PRIMARY KEY , NAME CHAR(64) , lft INTEGER NOT NULL UNIQUE CHECK (lft > 0), rght INTEGER NOT NULL UNIQUE CHECK (rgt > 1), CONSTRAINT order_okay CHECK (lft < rgt)); Если циклом делать, примерно так: CREATE PROCEDURE CLASS_INSERT ( CLASSID INTEGER , NAME CHAR (64) , PARENT INTEGER ) AS DECLARE VARIABLE RIGHT_MOST_SIBLING INTEGER ; DECLARE VARIABLE VAL_LEFT INTEGER ; DECLARE VARIABLE VAL_RIGHT INTEGER ; DECLARE VARIABLE VAL_ID INTEGER ; BEGIN SELECT WC.RGHT FROM CLASS WC WHERE (WC.CLASSID = :PARENT) INTO :RIGHT_MOST_SIBLING; FOR SELECT W1.LFT, W1.RGHT, W1.CLASSID FROM CLASS W1 WHERE (W1.RGHT >= :RIGHT_MOST_SIBLING) INTO :VAL_LEFT, :VAL_RIGHT, :VAL_ID DO BEGIN IF (:VAL_LEFT > :RIGHT_MOST_SIBLING) THEN VAL_LEFT = :VAL_LEFT + 2; UPDATE CLASS WR SET WR.RGHT = :VAL_RIGHT + 2, WR.RGHT = :VAL_LEFT WHERE WR.CLASSID = :VAL_ID; END INSERT INTO CLASS ( CLASSID, NAME, LFT, RGHT) VALUES ( :CLASSID, :NAME, :RIGHT_MOST_SIBLING, (:RIGHT_MOST_SIBLING + 1)); END то выдаёт: Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values. violation of PRIMARY or UNIQUE KEY constraint "LFT" on table "CLASS". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 08:35 |
|
||
|
UPDATE без CASE
|
|||
|---|---|---|---|
|
#18+
Дело в том, что это MS SQL конструкция, а мне надо хотя бы близко к стандарту. У меня FireBird стоит, а там таких "подпрыжек" нет. Таблица такая CREATE TABLE CLASS ( CLASSID INTEGER NOT NULL PRIMARY KEY , NAME CHAR(64) , lft INTEGER NOT NULL UNIQUE CHECK (lft > 0), rght INTEGER NOT NULL UNIQUE CHECK (rgt > 1), CONSTRAINT order_okay CHECK (lft < rgt)); Если циклом делать, примерно так: CREATE PROCEDURE CLASS_INSERT ( CLASSID INTEGER , NAME CHAR (64) , PARENT INTEGER ) AS DECLARE VARIABLE RIGHT_MOST_SIBLING INTEGER ; DECLARE VARIABLE VAL_LEFT INTEGER ; DECLARE VARIABLE VAL_RIGHT INTEGER ; DECLARE VARIABLE VAL_ID INTEGER ; BEGIN SELECT WC.RGHT FROM CLASS WC WHERE (WC.CLASSID = :PARENT) INTO :RIGHT_MOST_SIBLING; FOR SELECT W1.LFT, W1.RGHT, W1.CLASSID FROM CLASS W1 WHERE (W1.RGHT >= :RIGHT_MOST_SIBLING) INTO :VAL_LEFT, :VAL_RIGHT, :VAL_ID DO BEGIN IF (:VAL_LEFT > :RIGHT_MOST_SIBLING) THEN VAL_LEFT = :VAL_LEFT + 2; UPDATE CLASS WR SET WR.RGHT = :VAL_RIGHT + 2, WR.RGHT = :VAL_LEFT WHERE WR.CLASSID = :VAL_ID; END INSERT INTO CLASS ( CLASSID, NAME, LFT, RGHT) VALUES ( :CLASSID, :NAME, :RIGHT_MOST_SIBLING, (:RIGHT_MOST_SIBLING + 1)); END то выдаёт: Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values. violation of PRIMARY or UNIQUE KEY constraint "LFT" on table "CLASS". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 08:37 |
|
||
|
UPDATE без CASE
|
|||
|---|---|---|---|
|
#18+
А почему нельзя просто написать? UPDATE Personnel SET lft = lft - 1 where lft BETWEEN droplft AND droprgt UPDATE Personnel SET lft = lft - 2 where lft > droprgt UPDATE Personnel SET rgt = rgt - 1 where rgt BETWEEN droplft AND droprgt UPDATE Personnel SET rgt = rgt - 2 WHEN rgt > droprgt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2002, 11:05 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3483&tid=1823045]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 376ms |

| 0 / 0 |
