Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить имя связанной таблицы - запрос к системным таблицам / 17 сообщений из 17, страница 1 из 1
19.06.2018, 13:04
    #39662404
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Не смог найти информацию ни в сети( http://www.ibase.ru/sysqry/#anchor_4), ни в структуре системных таблиц.

Есть основная таблица table1 и куча справочников ref1, ref2, ref_n.
В основной таблице есть поля id_ref1, id_ref2, id_ref_n и соответственно внешние ключ на таблицы-справочники.
В общем, стандартная ситуация.
Помогите с запросом: как найти имя таблицы справочника, имея имя столбца основной таблицы + имя основной таблицы.
IBExprert показывает связи в том числе определяет имена связанных столбцов, но как он это делает, не могу понять.

Спасибо.
...
Рейтинг: 0 / 0
19.06.2018, 13:04
    #39662405
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
В IBExpert есть поиск по метаданным, но искать в системных таблицах он не хочет.
...
Рейтинг: 0 / 0
19.06.2018, 13:10
    #39662408
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
X11> Помогите с запросом: как найти имя таблицы справочника,
X11> имея имя столбца основной таблицы + имя основной таблицы.

См. таблицу RDB$REF_CONSTRAINTS

Запрос уж как-нибудь сам осилишь, мне лень.

X11> IBExprert показывает связи в том числе определяет имена
X11> связанных столбцов, но как он это делает, не могу понять.

Подсказываю - в IBE есть заветная кнопка SQL Monitor чи как её
там - жмёшь её, переходишь на нужную вкладку в нужном окошке,
возвращаешься в SQL Monitor и находишь и смотришь нужный запрос.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2018, 13:16
    #39662420
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
X11,

доработанный запрос N4

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    F.RDB$RELATION_NAME AS DETAIL_TABLE_NAME,
    F.RDB$CONSTRAINT_NAME AS FOREIGN_KEY_NAME,
    INDF.RDB$FIELD_NAME AS DETAIL_FIELD_NAME,
    T.RDB$RELATION_NAME AS MASTER_TABLE_NAME,
    T.RDB$CONSTRAINT_NAME AS PRIMARY_KEY_NAME,
    INDT.RDB$FIELD_NAME AS MASTER_FIELD_NAME
FROM
    RDB$REF_CONSTRAINTS C
    JOIN RDB$RELATION_CONSTRAINTS F ON C.RDB$CONSTRAINT_NAME = F.RDB$CONSTRAINT_NAME
    JOIN RDB$INDEX_SEGMENTS INDF ON INDF.RDB$INDEX_NAME = F.RDB$INDEX_NAME
    JOIN RDB$RELATION_CONSTRAINTS T  ON T.RDB$CONSTRAINT_NAME = C.RDB$CONST_NAME_UQ
    JOIN RDB$INDEX_SEGMENTS INDT ON INDT.RDB$INDEX_NAME = T.RDB$INDEX_NAME
ORDER BY F.RDB$RELATION_NAME, T.RDB$RELATION_NAME 
...
Рейтинг: 0 / 0
19.06.2018, 13:18
    #39662421
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Гаджимурадов РустамСм. таблицу RDB$REF_CONSTRAINTS
Я её уже крутил по всякому, в том числе и RDB$RELATION_CONSTRAINTS.


Гаджимурадов РустамПодсказываю - в IBE есть заветная кнопка SQL Monitor чи как её
там - жмёшь её, переходишь на нужную вкладку в нужном окошке,
возвращаешься в SQL Monitor и находишь и смотришь нужный запрос.

ок, попробую
спасибо
...
Рейтинг: 0 / 0
19.06.2018, 13:18
    #39662423
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Симонов Денис,

о!
спасибо
...
Рейтинг: 0 / 0
19.06.2018, 13:56
    #39662464
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
X11> Я её уже крутил по всякому, в том числе и RDB$RELATION_CONSTRAINTS.

Господи, да что там крутить-то... Ищешь по имени индекса в RDB$INDICES имя таблицы
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2018, 14:44
    #39662502
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Привет.

X11Помогите с запросом: как найти имя таблицы справочника, имея имя столбца основной таблицы + имя основной таблицы.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select tc.RDB$RELATION_NAME,
       ti.RDB$FIELD_NAME
  from RDB$RELATION_CONSTRAINTS sc
  join RDB$INDEX_SEGMENTS       si on ( si.RDB$INDEX_NAME      = sc.RDB$INDEX_NAME      )
  join RDB$REF_CONSTRAINTS      rc on ( rc.RDB$CONSTRAINT_NAME = sc.RDB$CONSTRAINT_NAME )
  join RDB$RELATION_CONSTRAINTS tc on ( tc.RDB$CONSTRAINT_NAME = rc.RDB$CONST_NAME_UQ   )
  join RDB$INDEX_SEGMENTS       ti on ( ti.RDB$INDEX_NAME      = tc.RDB$INDEX_NAME AND
                                        ti.RDB$FIELD_POSITION  = si.RDB$FIELD_POSITION  )
 where sc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
   and sc.RDB$RELATION_NAME = <имя основной таблицы>
   and si.RDB$FIELD_NAME = <имя столбца основной таблицы>


С уважением, Polesov.
...
Рейтинг: 0 / 0
25.06.2018, 15:54
    #39665421
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Симонов ДенисX11,

доработанный запрос N4

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    F.RDB$RELATION_NAME AS DETAIL_TABLE_NAME,
    F.RDB$CONSTRAINT_NAME AS FOREIGN_KEY_NAME,
    INDF.RDB$FIELD_NAME AS DETAIL_FIELD_NAME,
    T.RDB$RELATION_NAME AS MASTER_TABLE_NAME,
    T.RDB$CONSTRAINT_NAME AS PRIMARY_KEY_NAME,
    INDT.RDB$FIELD_NAME AS MASTER_FIELD_NAME
FROM
    RDB$REF_CONSTRAINTS C
    JOIN RDB$RELATION_CONSTRAINTS F ON C.RDB$CONSTRAINT_NAME = F.RDB$CONSTRAINT_NAME
    JOIN RDB$INDEX_SEGMENTS INDF ON INDF.RDB$INDEX_NAME = F.RDB$INDEX_NAME
    JOIN RDB$RELATION_CONSTRAINTS T  ON T.RDB$CONSTRAINT_NAME = C.RDB$CONST_NAME_UQ
    JOIN RDB$INDEX_SEGMENTS INDT ON INDT.RDB$INDEX_NAME = T.RDB$INDEX_NAME
ORDER BY F.RDB$RELATION_NAME, T.RDB$RELATION_NAME 




А это нормально, что запрос иногда возвращает 2 записи?
Или у меня в базе что-то не так со структурой?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
        T.RDB$RELATION_NAME AS MASTER_TABLE_NAME,
        INDT.RDB$FIELD_NAME AS MASTER_FIELD_NAME
      FROM RDB$REF_CONSTRAINTS C
        JOIN RDB$RELATION_CONSTRAINTS F ON C.RDB$CONSTRAINT_NAME = F.RDB$CONSTRAINT_NAME
        JOIN RDB$INDEX_SEGMENTS INDF ON INDF.RDB$INDEX_NAME = F.RDB$INDEX_NAME
        JOIN RDB$RELATION_CONSTRAINTS T  ON T.RDB$CONSTRAINT_NAME = C.RDB$CONST_NAME_UQ
        JOIN RDB$INDEX_SEGMENTS INDT ON INDT.RDB$INDEX_NAME = T.RDB$INDEX_NAME
      WHERE
        F.RDB$RELATION_NAME = :TABLENAME
      AND
        INDF.RDB$FIELD_NAME = :FNAME



Добавить FIRST 1 не сложно, но не в этом дело.
...
Рейтинг: 0 / 0
25.06.2018, 16:06
    #39665425
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
X11,

небольшой фикс, а то забыл что UNIQUE могут картинку портить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT
    F.RDB$RELATION_NAME AS DETAIL_TABLE_NAME,
    F.RDB$CONSTRAINT_NAME AS FOREIGN_KEY_NAME,
    INDF.RDB$FIELD_NAME AS DETAIL_FIELD_NAME,
    T.RDB$RELATION_NAME AS MASTER_TABLE_NAME,
    T.RDB$CONSTRAINT_NAME AS PRIMARY_KEY_NAME,
    INDT.RDB$FIELD_NAME AS MASTER_FIELD_NAME
FROM
    RDB$REF_CONSTRAINTS C
    JOIN RDB$RELATION_CONSTRAINTS F ON C.RDB$CONSTRAINT_NAME = F.RDB$CONSTRAINT_NAME
    JOIN RDB$INDEX_SEGMENTS INDF ON INDF.RDB$INDEX_NAME = F.RDB$INDEX_NAME
    JOIN RDB$RELATION_CONSTRAINTS T  ON T.RDB$CONSTRAINT_NAME = C.RDB$CONST_NAME_UQ
    JOIN RDB$INDEX_SEGMENTS INDT ON INDT.RDB$INDEX_NAME = T.RDB$INDEX_NAME
WHERE T.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
  AND F.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY F.RDB$RELATION_NAME, T.RDB$RELATION_NAME 



ну и если есть ключи в которых более одного поля всё равно дубли будут
...
Рейтинг: 0 / 0
25.06.2018, 16:21
    #39665433
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Симонов Денис> небольшой фикс, а то забыл что UNIQUE могут картинку портить

В запрос и изменения не вникал, но FK можно и на UQ создать, как раз.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2018, 16:25
    #39665436
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Гаджимурадов Рустам,

можно, но я думаю X11 это не надо
...
Рейтинг: 0 / 0
25.06.2018, 16:26
    #39665437
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Симонов Денис
Код: sql
1.
2.
WHERE T.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
  AND F.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'



ДОБАВИЛ, всё равно 2 записи
...
Рейтинг: 0 / 0
25.06.2018, 16:27
    #39665439
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
X11,

ну выведи остальные поля и посмотри чем эти 2 записи отличаются
...
Рейтинг: 0 / 0
25.06.2018, 16:28
    #39665441
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Обнаружил 2 внешних ключа для одного и того же поля на одну и ту же таблицу.
...
Рейтинг: 0 / 0
25.06.2018, 16:30
    #39665445
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
Удалил один внешний ключ.
...
Рейтинг: 0 / 0
25.06.2018, 18:47
    #39665524
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя связанной таблицы - запрос к системным таблицам
25.06.2018 16:28, X11 пишет:
> Обнаружил 2 внешних ключа для одного и того же поля на одну и ту же таблицу.

ODS какая?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить имя связанной таблицы - запрос к системным таблицам / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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