Страница 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
Подскажите что в нем неправильно?
Всё

Добавлено: 25 янв 2006, 10:07
kdv
муть какая то. каким образом НОМЕР ИНДЕКСА для таблицы связан с порядковым номером столбца в таблице?
И зачем тут вообще явные join городить? Если двум таблицам дал алиасы, почему остальным не дал?
посмотри сюда:
www.ibase.ru/devinfo/sysqry.htm
Добавлено: 25 янв 2006, 11:31
GByte
kdv, может и муть конечно, но все в мире относительно... Если я вопрос неправильно задал, то это незначит что все здесь муть....
каким образом НОМЕР ИНДЕКСА для таблицы связан с порядковым номером столбца в таблице
мне нужно знать к какому полю относится индекс, поглядев что в таблицах, решил, что они именно так и связаны, других связей пока не нашел. Если мое предположение неправильно, ткните носом, только не в langref.pdf.
И зачем тут вообще явные join городить?
так решил. Есть предложения по оптимизации?
Если двум таблицам дал алиасы, почему остальным не дал?
Дал только для того чтобы отличать разные экземпляры.
я сначала там и смотрел, только потом стал такой огород городить.
ЗЫ
С удовольствием выслушаю конструктивные замечания и предложения. Спасибо!
Добавлено: 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 писал(а):мое предположение о связи Номера Индекса и Номера поля в таблице верно.
Читай еще. Для разнообразия можно еще и головом подумать.
А ещё он в неё ест

Добавлено: 26 янв 2006, 07:37
GByte
kdv, я к вам не за выкаблучиванием, а за помощью.
А вот столбец и его номер, которому соответствует ключ конкретного индекса, находится в RDB$INDEX_SEGMENTS.
Если б ты действительно внимательно посмотрел в langref.pdf, а не выкаблучивался, то уже давно бы правильный запрос написал.
Так ты бы сам не выкаблучивался, а сразу так и сказал.
В любом случае, Спасибо за помощь и с пользой проведеное время.
ПС
На досуге можешь перечитать свои жутко информативные сообщения.

Добавлено: 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 таблица такая-то и такая-то.
Ато развели демогогию. К этому и правда талант нужен.