Страница 1 из 2

Явный JOIN 4-х таблиц

Добавлено: 25 янв 2006, 07:38
GByte
Есть такой запрос:

Код: Выделить всё

SELECT
    RDB$RELATION_FIELDS.RDB$RELATION_NAME,
    RDB$RELATION_FIELDS.RDB$FIELD_NAME,
    RF1.rdb$relation_name,
    RF1.rdb$field_name
FROM
    RDB$RELATION_FIELDS
        INNER JOIN
    RDB$INDICES
        ON
            (RDB$INDICES.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME)
                AND
            ((RDB$INDICES.RDB$INDEX_ID - 1) = RDB$RELATION_FIELDS.RDB$FIELD_POSITION)
        inner JOIN
    RDB$INDICES IND1
        on
            (IND1.rdb$index_name = rdb$indices.rdb$foreign_key)
        inner join
    rdb$relation_fields RF1
        ON
            (IND1.RDB$RELATION_NAME = RF1.RDB$RELATION_NAME)
                AND
            ((IND1.RDB$INDEX_ID - 1) = RF1.RDB$FIELD_POSITION)
;
Подскажите что в нем неправильно?

его я конечно поделю на 2 запроса, но все же интересно, что там нетак???

Спасибо!

Добавлено: 25 янв 2006, 08:52
dimitr
Ты бы хоть сказал, что тебя в нем не устраивает.

Добавлено: 25 янв 2006, 09:37
GByte
Меня в нем все устраивает, только он не работает - IBExpert или говорит об ошибке (не нравятся ему IND1 и RF1) или выводит пустую таблицу...

Re: Явный JOIN 4-х таблиц

Добавлено: 25 янв 2006, 09:57
hvlad
GByte писал(а):

Код: Выделить всё

RDB$INDICES.RDB$INDEX_ID - 1 = RDB$RELATION_FIELDS.RDB$FIELD_POSITION
Подскажите что в нем неправильно?
Всё :lol:

Добавлено: 25 янв 2006, 10:07
kdv
муть какая то. каким образом НОМЕР ИНДЕКСА для таблицы связан с порядковым номером столбца в таблице?
И зачем тут вообще явные join городить? Если двум таблицам дал алиасы, почему остальным не дал?

посмотри сюда:
www.ibase.ru/devinfo/sysqry.htm

Добавлено: 25 янв 2006, 11:31
GByte
kdv, может и муть конечно, но все в мире относительно... Если я вопрос неправильно задал, то это незначит что все здесь муть....

каким образом НОМЕР ИНДЕКСА для таблицы связан с порядковым номером столбца в таблице
мне нужно знать к какому полю относится индекс, поглядев что в таблицах, решил, что они именно так и связаны, других связей пока не нашел. Если мое предположение неправильно, ткните носом, только не в langref.pdf.
И зачем тут вообще явные join городить?
так решил. Есть предложения по оптимизации?
Если двум таблицам дал алиасы, почему остальным не дал?
Дал только для того чтобы отличать разные экземпляры.
посмотри сюда:
www.ibase.ru/devinfo/sysqry.htm
я сначала там и смотрел, только потом стал такой огород городить.

ЗЫ
С удовольствием выслушаю конструктивные замечания и предложения. Спасибо!

Добавлено: 25 янв 2006, 12:27
Merlin
GByte писал(а): ткните носом, только не в langref.pdf.
Ну, Мопассана можно почитать...

Добавлено: 25 янв 2006, 13:52
GByte
Merlin, после прочтения "Мопасана" выяснилось, что мое предположение о связи Номера Индекса и Номера поля в таблице верно.

Премного благодарен, за помощь.

ПС

Код: Выделить всё

SELECT
    RDB$RELATION_FIELDS.RDB$RELATION_NAME TABLE_NAME,
    RDB$RELATION_FIELDS.RDB$FIELD_NAME FIELD_NAME,
    RDB$INDICES.RDB$INDEX_NAME FK_NAME,
    RDB$INDICES.rdb$foreign_key PK_NMAE
FROM
    RDB$RELATION_FIELDS
        INNER JOIN
    RDB$INDICES
        ON
            (RDB$INDICES.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME)
                AND
            ((RDB$INDICES.RDB$INDEX_ID - 1) = RDB$RELATION_FIELDS.RDB$FIELD_POSITION)
;

Добавлено: 25 янв 2006, 14:23
dimitr
GByte писал(а):Меня в нем все устраивает, только он не работает - IBExpert или говорит об ошибке (не нравятся ему IND1 и RF1) или выводит пустую таблицу...
Т.е. цитировать сообщения об ошибке мы не хотим и предпочитаем вольный пересказ? Причем на один и тот же запрос IBE либо ругается, либо выводит пустой грид? Не иначе флуктуации вакуума виноваты.
мое предположение о связи Номера Индекса и Номера поля в таблице верно.
Читай еще. Для разнообразия можно еще и головом подумать.

Добавлено: 25 янв 2006, 15:59
kdv
может и муть конечно, но все в мире относительно... Если я вопрос неправильно задал, то это незначит что все здесь муть
вопрос ты задал тоже не правильно, но это не важно. важно что ты неправильный запрос написал.
выяснилось, что мое предположение о связи Номера Индекса и Номера поля в таблице верно.
ахинею несешь, не краснея.

RDB$INDEX_ID - это порядковый номер индекса для конкретной таблицы. Причем этот порядковый номер не обязательно идет с 1, и может меняться при деактивации и последующей активации индекса.
Деактивированные индексы вообще номера не имеют.

А вот столбец и его номер, которому соответствует ключ конкретного индекса, находится в RDB$INDEX_SEGMENTS.

Если б ты действительно внимательно посмотрел в langref.pdf, а не выкаблучивался, то уже давно бы правильный запрос написал. :)

Добавлено: 25 янв 2006, 16:33
hvlad
dimitr писал(а):
GByte писал(а):мое предположение о связи Номера Индекса и Номера поля в таблице верно.
Читай еще. Для разнообразия можно еще и головом подумать.
А ещё он в неё ест :lol:

Добавлено: 26 янв 2006, 07:37
GByte
kdv, я к вам не за выкаблучиванием, а за помощью.
А вот столбец и его номер, которому соответствует ключ конкретного индекса, находится в RDB$INDEX_SEGMENTS.

Если б ты действительно внимательно посмотрел в langref.pdf, а не выкаблучивался, то уже давно бы правильный запрос написал.
Так ты бы сам не выкаблучивался, а сразу так и сказал.

В любом случае, Спасибо за помощь и с пользой проведеное время.

ПС
На досуге можешь перечитать свои жутко информативные сообщения. :twisted:

Добавлено: 26 янв 2006, 08:42
GByte
kdv, это у меня глюки после прочтения Мопасана или у всех так:

Код: Выделить всё

1) "Таблица1" в ней поля:
          ID
          FK1
          FK2
          FIELD1
          FK3

2) Удалил FIELD1, FK3
3) Создал FIELD11, FK33
перед и после действий (2) и (3) были выполены следующие запросы:

Код: Выделить всё

1)
SELECT
    RDB$RELATION_FIELDS.RDB$RELATION_NAME,
    RDB$RELATION_FIELDS.RDB$FIELD_NAME,
    RDB$INDICES.RDB$INDEX_NAME,
    RDB$INDICES.rdb$foreign_key
FROM
    RDB$RELATION_FIELDS
        INNER JOIN
    RDB$INDICES
        ON
            (RDB$INDICES.RDB$RELATION_NAME = RDB$RELATION_FIELDS.RDB$RELATION_NAME)
                AND
            ((RDB$INDICES.RDB$INDEX_ID - 1) = RDB$RELATION_FIELDS.RDB$FIELD_POSITION)
;

2)
SELECT * FROM RDB$INDEX_SEGMENTS
Запрос №1 выводит данные по номерам полей верно.
Запрос №2 выводит номера полей 0 или 1. - Для всех индексов в Таблице1 выводит 0, для некоторых системных таблиц выводит 1. Других значений небывает.

Многоуважаемые господа, прошу проверить, может это у меня и вправду от Мопасана.

Добавлено: 26 янв 2006, 10:39
kdv
слушай, ты мое сообщение прочитал? А почему опять ... пишешь вместо нормального запроса? Ждешь, пока тебе его на блюдечке вынесут?
Запрос №1 выводит данные по номерам полей верно.
это случайно получилось. я тебе еще раз говорю - столбцы и их номера - в rdb$index_segments. Твое объединение таблиц по RDB$INDICES.RDB$INDEX_ID - 1) = RDB$RELATION_FIELDS.RDB$FIELD_POSITION
это неправильно.
Так ты бы сам не выкаблучивался, а сразу так и сказал.
В любом случае, Спасибо за помощь и с пользой проведеное время.
На досуге можешь перечитать свои жутко информативные сообщения.
если будешь выступать, вместо того чтобы 5 минут подумать - забаню элементарно.
1) "Таблица1" в ней поля:
ID
FK1
FK2
FIELD1
FK3

2) Удалил FIELD1, FK3
3) Создал FIELD11, FK33
столбцы имеют соответственно номера 0, 1, 2, 3, 4, 5.
по каким столбцам у тебя индексы на данный момент есть - непонятно.
Допустим, есть по ID, FK1, FK2, F3. Индекс по ID будет иметь номер 1 (в rdb$indices). Если ты FK по этой таблице будешь создавать не в порядке FK1, FK2, FK3, а например 3, 2 и 1, то они будут иметь номера индексов:
FK3 - 2
FK2 - 3
FK1 - 1

Если ты удалил FIELD1, то столбец FK3 получил номер 4. Номер индекса для него естественно, не изменится. Если создал FIELD11, у него номер будет 5, а если на него создал FK33, то его индекс будет иметь номер 4.
А теперь открой rdb$index_segments.
Столбец RDB$FIELD_POSITION в этой таблице указывает на порядковый номер столбца В ИНДЕКСЕ!!!
Поскольку номера столбцов в таблице могут меняться, никто на них не закладывается. То есть, можно вытащить
1. порядковый номер столбца в таблице
2. индекс, в который попадает этот столбец
3. порядковый номер столбца в индексе

Добавлено: 26 янв 2006, 11:15
GByte
kdv,
если будешь выступать, вместо того чтобы 5 минут подумать - забаню элементарно.
прошу ВАС на основании выше сказанного:

1) еще раз перечитать свои сообщения.
2) на основании анализа моих и Ваших сообщений принять решение о "забанивании" меня или Вас.

С уважением GByte.

Добавлено: 26 янв 2006, 11:42
kdv
я взаимно прошу перечитать в том числе и свои сообщения, а также наконец взглянуть в langref.pdf.

Добавлено: 26 янв 2006, 12:20
Merlin
Зайцы! Дед Мазай - это миф. Спасаться надо самим. (С)

Удивляюсь долготерпению kdv. Вот что значит саппорт-профи. Я б давно послал по известному адресу.

Добавлено: 26 янв 2006, 12:41
GByte
Merlin, а ты и послал.

Я вроде ничего страшного не спрашивал, только помощи попросил...
Ничего страшного в моем стремлении разобраться во внутренностях FB нету.

Если я непонятно вопрос задал, так бы и сказали, вопросы наводящие бы задали.

Или Вы в коде запроса увидели что-то нецензурное?


А Вы господа, не только ПРОФИ и саппорта и ФБ, но и хамы приличные. Нестыдно Уважаемые? Я к Вам как настоящим ПРОФИ обратился, ну невнимательно langref читал, а вы.....

Всего Вам доброго!

ПС
на месте КДВ я бы сложил с себя полномочия Модератора или минимум на вопросы перестал отвечать.

Добавлено: 26 янв 2006, 13:24
Merlin
GByte писал(а): Ничего страшного в моем стремлении разобраться во внутренностях FB нету.
Не скажи. Если человек не в состоянии прочитать описание четырёх системных таблиц и сделать очевидные выводы, а вместо этого канючит и встаёт в позы два дня на форуме - это страшно.
GByte писал(а): ПС
на месте КДВ я бы сложил с себя полномочия Модератора или минимум на вопросы перестал отвечать.
По первой части - не говори ему что он должен делать, а то ведь он таки скажет тебе куда идти. А второе - это идея.

Добавлено: 26 янв 2006, 13:31
GByte
Merlin, ну ты прямо ГЕНИЙ саппорта.

Ты мне скажи, мог сразу подсказать:
смотри langref.pdf таблица такая-то и такая-то.

Ато развели демогогию. К этому и правда талант нужен.