Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос к системным таблицам / 13 сообщений из 13, страница 1 из 1
18.03.2014, 13:07:31
    #38589292
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Добрый день, уважаемые форумчане
Передо мной стоит задача взять из системных таблиц следующие данные:
1) Позиция поля RDB$FIELD_POSITION
2) Имя поля RDB$FIELD_NAME
3) Длина поля RDB$FIELD_LENGHTH
4) Тип поля (integer,char..) RDB$FIELD_TYPE
5) Ограничение (Primary key, not null..) RDB$CONSTRAINT_TYPE

За основу взял запрос №1 из этой статьи , дописал до следующего вида:
Код: sql
1.
2.
3.
4.
select R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME, F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, C.RDB$CONSTRAINT_TYPE 
from RDB$FIELDS F, RDB$RELATION_FIELDS R, RDB$RELATION_CONSTRAINTS C 
where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 AND RDB$RELATION_NAME='имямоейтаблицы'
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION;




При попытке выполнить такой запрос появляется следующая ошибка:
SQL error code -204
Ambiguous field name between table RDB$RELATION_FIELDS and table RDB$RELATION_CONSTRAINTS
RDB$RELATION_NAME

Может подскажете, где я ошибся в составлении запроса, и как это поправить? Заранее благодарю.
использую Delphi 7.3.4.3 Lite и Firebird 2.5.2
...
Рейтинг: 0 / 0
18.03.2014, 13:27:47
    #38589346
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
DohAmbiguous field name between table RDB$RELATION_FIELDS and table
RDB$RELATION_CONSTRAINTS RDB$RELATION_NAME

Может подскажете, где я ошибся в составлении запроса, и как это поправить?

Ты не указал из какой из вышеназванных таблиц хочешь взять вышеназванное поле.

Открой для себя Google translate или англо-русский словарь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.03.2014, 13:46:44
    #38589382
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Doh,

А написать R.RDB$RELATION_NAME пробовал?
...
Рейтинг: 0 / 0
18.03.2014, 14:05:13
    #38589429
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Dimitry Sibiryakov,
авторОткрой для себя Google translate или англо-русский словарь
С переводом проблем не было, просто не понял сам посыл.
авторТы не указал из какой из вышеназванных таблиц хочешь взять вышеназванное поле.
А вот за это сообщение спасибо, Вы сдвинули меня с мертвой точки. Изменил код следующим образом:
Код: sql
1.
2.
3.
4.
select R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME, F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, C.RDB$CONSTRAINT_TYPE 
from RDB$FIELDS F, RDB$RELATION_FIELDS R, RDB$RELATION_CONSTRAINTS C 
where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 AND R.RDB$RELATION_NAME='имямоейтаблицы'
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION;


Теперь запрос выполняется, но не так, как мне нужно. В таблице-результате запроса происходит дублирование данных. Пример:
FieldPosition: 0
FieldName: NOM
FieldLenghth: 10
FieldType: 14
ConstraintType: NOT NULL

и так 50 строк, потом еще 10 строк, но вместо NOT NULL стоит PRIMARY KEY. Причем наблюдается такое с каждым полем проверяемой таблицы (той, которая R.RDB$RELATION_NAME), хотя реально только поле NOM является PRIMARY KEY
...
Рейтинг: 0 / 0
18.03.2014, 14:10:16
    #38589444
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Doh,

Нет условия связи для RDB$RELATION_CONSTRAINTS C
...
Рейтинг: 0 / 0
18.03.2014, 14:14:21
    #38589449
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
DarkMaster,
Вот только что по совету Dimitry Sibiryakov попробовал. Запрос начал выполняться, но другая проблема появилась.
...
Рейтинг: 0 / 0
18.03.2014, 15:07:57
    #38589546
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
авторНет условия связи для RDB$RELATION_CONSTRAINTS C
m7m, я тоже так подумал.
Значит, мне нужно связать F.RDB$FIELD_NAME с каким-то полем из RDB$RELATION_CONSTRAINTS, но с каким?
Есть ли в RDB$RELATION_CONSTRAINTS какое нибудь поле типа FIELD_NAME или FIELD_INDEX?
...
Рейтинг: 0 / 0
18.03.2014, 15:11:05
    #38589554
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
DohЕсть ли в RDB$RELATION_CONSTRAINTS какое нибудь поле типа FIELD_NAME или
FIELD_INDEX?
Все поля, какие есть в этой и остальных системных таблицах описаны в Language Reference.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2014, 15:46:46
    #38590797
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Dimitry Sibiryakov,
можно еще раз Вашей подсказки попросить?
Чтобы связать данные из RDB$RELATION_CONSTRAINTS C с RDB$FIELDS F и RDB$RELATION_FIELDS R, мне нужно воспользоваться промежуточной таблицей RDB$INDEX_SEGMENTS S, правильно? То есть условие должно быть таким:
1) F связывается с R по F.RDB$FIELD_NAME и R.RDB$FIELD_SOURCE
2) R связывается с S по RDB$FIELD_NAME
3) S связывается с C по RDB$INDEX_NAME
Готовый запрос тогда должен выглядеть следующим образом
Код: sql
1.
2.
3.
4.
5.
select R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME, F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, C.RDB$CONSTRAINT_TYPE 
from RDB$FIELDS F, RDB$RELATION_FIELDS R, RDB$RELATION_CONSTRAINTS C, RDB$INDEX_SEGMENTS S 
where F.RDB$FIELD_NAME=R.RDB$FIELD_SOURCE and R.RDB$FIELD_NAME=S.RDB$FIELD_NAME and S.RDB$INDEX_NAME=C.RDB$INDEX_NAME
and R.RDB$SYSTEM_FLAG = 0 AND R.RDB$RELATION_NAME='имямоейтаблицы'
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION;


Видимо RDB$RELATION_CONSTRAINTS C всё равно неправильно привязана, результат запроса выдает информацию только про поле PRIMARY KEY, опять же может продублировать такую строку несколько раз.
Вопрос: правильно ли я пытаюсь делать связку через дополнительную системную таблицу RDB$INDEX_SEGMENTS S, или это ошибочный путь?
...
Рейтинг: 0 / 0
19.03.2014, 16:56:59
    #38590960
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Doh1) F связывается с R по F.RDB$FIELD_NAME и R.RDB$FIELD_SOURCE
2) R связывается с S по RDB$FIELD_NAME
3) S связывается с C по RDB$INDEX_NAME
2) по RDB$FIELD_NAME AND RDB$RELATION_NAME

Пиши явные JOIN - проще разобраться как что с чем связывается. В твоей мешанине чёрт ногу
сломит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2014, 09:42:29
    #38591468
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    SELECT *
    FROM RDB$RELATION_CONSTRAINTS R
    INNER JOIN RDB$INDEX_SEGMENTS I ON I.RDB$INDEX_NAME = R.RDB$INDEX_NAME
    INNER JOIN RDB$RELATION_FIELDS RF ON RF.RDB$FIELD_NAME = I.RDB$FIELD_NAME
      AND RF.RDB$RELATION_NAME = R.RDB$RELATION_NAME
    INNER JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
    WHERE R.RDB$RELATION_NAME = :TABLE_NAME
      AND R.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
    ORDER BY I.RDB$FIELD_POSITION
...
Рейтинг: 0 / 0
20.03.2014, 09:54:05
    #38591475
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
Чуть переписать, и получится:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT RF.RDB$FIELD_NAME, R.RDB$CONSTRAINT_TYPE
FROM RDB$RELATION_FIELDS RF
INNER JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
  AND F.RDB$COMPUTED_BLR IS NULL
LEFT OUTER JOIN RDB$RELATION_CONSTRAINTS R
  INNER JOIN RDB$INDEX_SEGMENTS I ON I.RDB$INDEX_NAME = R.RDB$INDEX_NAME
   ON R.RDB$RELATION_NAME = RF.RDB$RELATION_NAME
  AND I.RDB$FIELD_NAME = RF.RDB$FIELD_NAME
WHERE RF.RDB$RELATION_NAME = 'BANKS'
ORDER BY RF.RDB$FIELD_POSITION
...
Рейтинг: 0 / 0
23.03.2014, 12:52:47
    #38593885
Doh
Doh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к системным таблицам
__Avenger__,
огромное Вам спасибо! С учётом моих нужд запрос выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT  RF.RDB$FIELD_POSITION, RF.RDB$FIELD_NAME, F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE, R.RDB$CONSTRAINT_TYPE
FROM RDB$RELATION_FIELDS RF
INNER JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
  AND F.RDB$COMPUTED_BLR IS NULL
LEFT OUTER JOIN RDB$RELATION_CONSTRAINTS R
  INNER JOIN RDB$INDEX_SEGMENTS I ON I.RDB$INDEX_NAME = R.RDB$INDEX_NAME
   ON R.RDB$RELATION_NAME = RF.RDB$RELATION_NAME
  AND I.RDB$FIELD_NAME = RF.RDB$FIELD_NAME
WHERE RF.RDB$RELATION_NAME = 'имямоейтаблицы'
ORDER BY RF.RDB$FIELD_POSITION
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос к системным таблицам / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]