[Firebird] В запросе не определяется поле
, Рекурсивный запрос не разруливает поле
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.9] |
|
|
информация о разделе
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
[Firebird] В запросе не определяется поле
, Рекурсивный запрос не разруливает поле
|
Сообщ.
#1
,
|
|
|
|
Привет. У меня есть иерархическая таблица XXXX. Пытаюсь для нода определить парентов и чайлдов, чтобы произвести вставку в другую таблицу. Однако Firebird 2.1 ругается на:
Column does not belong to referenced table. Dynamic SQL Error. SQL error code = -206. Column unknown. C.ID. At line 8, column 46. Сам текст запроса: поля есть. Если поменять куски CHILDREN и PARENT_LIST местами, то будет ругаться на то, что нет PT.ID. В чем может быть проблема? ![]() ![]() MERGE INTO MO_DATAGROUP_LINK DGL USING ( WITH RECURSIVE CHILDREN AS ( SELECT 923 ID FROM RDB$DATABASE UNION ALL SELECT S.ID FROM SPRT S JOIN CHILDREN C ON C.ID = S.PARENTID ), PARENT_LIST AS ( SELECT PARENTID ID FROM SPRT WHERE ID = 923 UNION ALL SELECT PARENTID ID FROM SPRT T JOIN PARENT_LIST PT ON T.ID = PT.ID) SELECT ID FROM PARENT_LIST WHERE ID IS NOT NULL UNION ALL SELECT ID FROM CHILDREN ) PX ON DGL.DATAID = PX.ID AND DGL.DATAGROUPID = 896 AND DGL.TABLENAME = 'XXXX' WHEN NOT MATCHED THEN INSERT (DATAGROUPID, TABLENAME, DATAID) VALUES (:D_VALUE, 'XXXX', PX.ID); |
|
Сообщ.
#2
,
|
|
|
|
А где у тебя таблица C?
|
|
Сообщ.
#3
,
|
|
|
|
Romkin, "JOIN CHILDREN C ON", не?
|
|
Сообщ.
#4
,
|
|
|
|
Присоедини псевдоним ко всем полям, оно путается скорее всего
|
|
Сообщ.
#5
,
|
|
|
|
Если присоединять сюда "SELECT S.ID FROM SPRT S JOIN CHILDREN C ON C.ID = S.PARENTID" по аналогии с выборкой PARENT_LIST, то толку никакого, к сожалению, та же ошибка. Кстати, если поменять местами блоки CHILDREN и PARENT_LIST как есть, то будет уже ругаться на выборку PARENT_LIST аналогично.
|
|
Сообщ.
#6
,
|
|
|
|
простите, а это что без запятой пишется?
![]() ![]() SELECT PARENTID ID FROM |
|
Сообщ.
#7
,
|
|
|
|
Игорь Акопян, а почему оно должно писаться с запятой?
Добавлено Я не понимаю, господа, вы теоретически пытаетесь что-то понять и найти синтаксические ошибки? Не проще ли к себе в IBExpert или FlameRobin скопировать запрос и проверить? Структура таблиц тривиальна: SPRT (ID - int PK, PARENTID - int FK to SPRT) MO_DATAGROUP_LINK (ID - int PK, DATAGROUPID - int, TABLENAME - varchar, DATAID - int) Причем достаточно двух таблиц, т.к. MO_DATAGROUP_LINK.DATAID - это ссылка на SPRT.ID без FK (там FK не нужен по архитектурным причинам). |
|
Сообщ.
#8
,
|
|
|
|
Думаю что проще(или даже НАДО) в хр.процедуре сделать,особенно если там рекурсия.(Разбираться с твоим запросом лень) Я когда-то писал хр.процедуру (с запросом выходил большой гемор-я решил,что это невозможно сделать,хотя может и не так-не претендую на истину в последней инстанции),в которой определял верхнего парента,всех чайдлов,если не ошибаюсь.(давно было,но процедуру найти,думаю, можно) Похоже и тебе что-то аналогичное надо?
|