Фильтр по столбцу, созданному подзапросом

ЧАстые Вопросы и Ответы

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

Ответить
ssvnec
Сообщения: 15
Зарегистрирован: 17 июл 2007, 00:20

Фильтр по столбцу, созданному подзапросом

Сообщение ssvnec » 27 июл 2007, 19:00

Добрый день. Делаю SQL таблицу, объединенную из нескольких. Но в главной таблице два разных поля ссылаются на записи другой одной и той же таблицы (на разные записи). Т.е. пример:

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

SELECT
  P.NOM,
  P.OPNOM,
  O.SUM,
  P.DT,
  P.KT,
  (SELECT DED_NOM FROM BS
     WHERE BS_NOM=P.DT) AS DT_DED_NOM,
  (SELECT DED_NOM FROM BS
     WHERE BS_NOM=P.KT) AS KT_DED_NOM,
  O.NAZV
FROM PROV P
  JOIN OPRT OP ON P.OPNOM= O.NOM
WHERE (P.DT=:DTPAR)OR(DT_DED_NOM=:DTPAR)
[Пушкин отформатировал код тегом code]

Строчка WHERE выдает ошибку, т.к. нет такого поля DT_DED_NOM
Но мне просто необходимо ставить такой фильтр.
Как отфильтровать конечную таблицу по такому полю?

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

Сообщение Merlin » 27 июл 2007, 19:10

Если религия позволяет использовать в одном запросе слово JOIN только один раз - дублировать подзапрос в WHERE целиком. Через некоторое время возвращаться с вопросом - а чо оно так тормозит-то?

ssvnec
Сообщения: 15
Зарегистрирован: 17 июл 2007, 00:20

Сообщение ssvnec » 27 июл 2007, 19:12

Я пробовал копировать подзапрос в WHERE, тогда ошибка не выдается, но фильтр не работает, т.е. таблица не фильтруется.

ssvnec
Сообщения: 15
Зарегистрирован: 17 июл 2007, 00:20

Сообщение ssvnec » 27 июл 2007, 19:27

Кстати вариант с еще одним JOIN -ом мне не подходит, т.к. нужен еще такой фильтр:

SELECT
P.NOM,
P.OPNOM,
O.SUM,
P.DT,
P.KT,
(SELECT DED_NOM FROM BS
WHERE BS_NOM=P.DT) AS DT_DED_NOM,
(SELECT DED_NOM FROM BS
WHERE BS_NOM=P.KT) AS KT_DED_NOM,
O.NAZV
FROM PROV P
JOIN OPRT OP ON P.OPNOM= O.NOM
WHERE (P.DT=:DTPAR)OR(DT_DED_NOM=:DTPAR)
(P.KT=:KTPAR)OR(KT_DED_NOM=:KTPAR)

[Пушкин делает предупреждение автору за неформатирование кодатегом code]

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

Сообщение Merlin » 27 июл 2007, 19:31

ssvnec писал(а):Кстати вариант с еще одним JOIN -ом мне не подходит, т.к. нужен еще такой фильтр:
Не вижу никакой причинно-следственной связи между частями предложения, разделёнными запятой. Или для кадого последующего JOIN в запросе нужен отдельный пинок, теперь предел - 2?

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

Сообщение Merlin » 27 июл 2007, 19:41

ssvnec писал(а):Я пробовал копировать подзапрос в WHERE, тогда ошибка не выдается, но фильтр не работает, т.е. таблица не фильтруется.
Проглядел. Ну что могу сказать - технология копирования, видать, освоена не лучше сиквела...

Кузнецов Евгений
Сообщения: 144
Зарегистрирован: 16 фев 2006, 22:36

Сообщение Кузнецов Евгений » 29 июл 2007, 15:08

Доброго времени суток!

To ssvnec

1) SUM - зарезервированное слово, и как Вы обращаетесь
к полю с таким названием без двойных кавычек, мне непонятно

2) Названия таблиц у Вас неудачны - сторонний наблюдатель (и Вы
сами через некоторое время) не сообразит, что скрывается за
именем BS, оно больше похоже на алиас таблицы

3) Никто не запрещает делать несколько JOIN с одной таблицей
(используя разные алиасы, естественно)
Советую ознакомиться с http://www.ibase.ru/devinfo/joins.htm

ssvnec
Сообщения: 15
Зарегистрирован: 17 июл 2007, 00:20

Сообщение ssvnec » 09 окт 2007, 21:55

Попробую привести другой пример. Например, есть таблица людей LUDI с полями NOMER (уникальный номер), IMA (имя), DATAR (дата рождения), POL (пол), MAMA (ссылка на маму в этой же таблице), PAPA (ссылка на папу в этой же таблице).
Есть еще таблица BILETZOO - билеты в зоопарк на ребенка, у которого есть мама и папа, которая состоит из полей BNOM (номер билета), DATA (дата билета), REBENOK (ссылка на человека), CENA (цена).
Нужно сформировать таблицу билетов с полями:
BNOM DATA REBENOK CENA IMAREBENKA DATARREBENKA POLREBENKA IMAMAMI IMAPAPI
где IMAMAMI и IMAPAPI - это имена мамы и папы
Если я буду, как вы говорите, использовать 2 или 3 JOIN таблицы BILETZOO с таблицей LUDI (т.е. BILETZOO 3 раза джойнится с таблицей LUDI) как файрберд поймет, в какое поле чье имя записывать?

ПС. Просьба не задавать вопросы типа "а если мамы или папы нет")) все имена полей выдуманные и если они совпадают с зарезервированными словами - это случайность

Кузнецов Евгений
Сообщения: 144
Зарегистрирован: 16 фев 2006, 22:36

Сообщение Кузнецов Евгений » 09 окт 2007, 22:20

Доброго времени суток!
ssvnec писал(а):Если я буду, как вы говорите, использовать 2 или 3 JOIN таблицы BILETZOO с таблицей LUDI (т.е. BILETZOO 3 раза джойнится с таблицей LUDI) как файрберд поймет, в какое поле чье имя записывать?
Используйте алиасы таблиц (эта информация есть в статье).

P.S.
Неужели проблема еще актуальна?

Ответить