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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

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

Сообщение GByte » 25 янв 2006, 07:38

Есть такой запрос:

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

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 запроса, но все же интересно, что там нетак???

Спасибо!

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 янв 2006, 08:52

Ты бы хоть сказал, что тебя в нем не устраивает.

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 25 янв 2006, 09:37

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

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

Сообщение hvlad » 25 янв 2006, 09:57

GByte писал(а):

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 янв 2006, 10:07

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

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

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 25 янв 2006, 11:31

kdv, может и муть конечно, но все в мире относительно... Если я вопрос неправильно задал, то это незначит что все здесь муть....

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

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 янв 2006, 12:27

GByte писал(а): ткните носом, только не в langref.pdf.
Ну, Мопассана можно почитать...

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 25 янв 2006, 13:52

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)
;

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 25 янв 2006, 14:23

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 янв 2006, 15:59

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

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

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

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 25 янв 2006, 16:33

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

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 26 янв 2006, 07:37

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

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

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

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

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 26 янв 2006, 08:42

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. Других значений небывает.

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 янв 2006, 10:39

слушай, ты мое сообщение прочитал? А почему опять ... пишешь вместо нормального запроса? Ждешь, пока тебе его на блюдечке вынесут?
Запрос №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. порядковый номер столбца в индексе

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 26 янв 2006, 11:15

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

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 янв 2006, 11:42

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 янв 2006, 12:20

Зайцы! Дед Мазай - это миф. Спасаться надо самим. (С)

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

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 26 янв 2006, 12:41

Merlin, а ты и послал.

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

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

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


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

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

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 янв 2006, 13:24

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

GByte
Сообщения: 29
Зарегистрирован: 19 янв 2006, 11:31

Сообщение GByte » 26 янв 2006, 13:31

Merlin, ну ты прямо ГЕНИЙ саппорта.

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

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

Ответить