Здравствуйте!
Postgresql изучаю из любопытства и проф. интересов. и на кое каком примере у меня возникла проблема в реализации, вот собственно запрос:
SELECT * FROM (SELECT tablelink FROM tarifs WHERE tarif_id = 4) AS alias_x WHERE alias_x.id = 80
Суть такова, пытаюсь в подзапросе вытащить из таблицы tarifs поле tablelink (character verying) и затем уже сделать select * по этой таблице, но к сожалению что то не выходит.
Прошу помощи! Как это возможно реализовать?
Заранее спасибо!
Смотрите что должно быть: В
Смотрите что должно быть:
В результате всего запроса должна получиться таблица.
В выражении FROM должны быть указаны таблицы (реальные или виртуальные) из которых потом делается выборка предложением SELECT. В предложении WHERE происходит фильтрация результатов.
Подробно вся структура SELECT очень хорошо описана в мануал:
http://postgresql.ru.net/manual/queries.html
А у вас получается. что в предложении FROM остаётся виртуальная таблица лишь с ОДНОЙ колонкой tablelink, причём если исходной таблице tarif_id это первичный ключ, то в этой таблице ещё и всего одна строка будет. Следовательно дальнейшее указание WHERE бессмыслено, потому что в виртуальной таблице, созданной подзапросом нет поля id.
Почитал то что вы написали хотите сделать и честно говоря ничего не понял. Опишите подробней какие поля должны быть в выходной таблице и по каким критериям, потому что глядя на запрос и на ваше описание я этого не понимаю.
Re::
Вот смотрите,
Есть таблица Tarifs структура такая
create table tarifs (
tarif_id integer ...... (Эт первичный ключ для данной таб.),
tarif_name character .....,
tablelink character verying(255) (Вот это поле самое интересное, в ней буду хранить имя таблицы соответсвенно в стринг значении)
)
К приеру вот так
tarif_id | tarif_name | tablelink |
_______ |____________ |__________ |_
....1.....|...'Тариф 1'..|....'VPN'....|
_______ |____________ |__________ |
ТАк же есть такая таблица VPN (реальная не виртуальная).
Таблица VPN:
.....id....| vpn_settings|
________|______________|
.....3.....|..."Что то"....|
________|_____________ |
Я пытаюсь сделать так
SELECT * FROM (SELECT tablelink FROM tarifs WHERE tarif_id = 1) AS alias_x WHERE alias_x.id = 3
В итоге хочу получить такое select * from VPN as alias_x where alias_x = 3,
Где tablelink это результат запроса
(SELECT tablelink FROM tarifs WHERE tarif_id = 1)
.То есть я хочу пройтись по таблице tarifs с криетерием отбора где tarif_id = 1 вытащить от туда tablelink (Собственно значение tablelink будет играть роль имени таблице в запросе
SELECT * FROM (SELECT tablelink FROM tarifs WHERE tarif_id = 1) AS alias_x WHERE alias_x.id = 3
Т.е. грубо говоря вы хотите
Т.е. грубо говоря вы хотите одним запросом из некой таблицы достать имя другой таблицы и выполнить оставшуюся часть запроса уже над таблицей, имя которой достали? Так делать нельзя. Даже в ORACLE. Поясню почему: потому что на момент компиляции запроса PostgreSQL не знает какова будет структура в таблице, имя которой вы извлекаете и даже не знает существует ли она вообще.
RE::admin
спасибо!
А вообще как можно сделать то что я задумал? Поделитесь мыслями
Если это вообще реально
То, что вы задумали я уже
То, что вы задумали я уже написал - никак.
А если у вас есть таблицы, которые содержат связанную информацию, то извлечь её можно разными способами, основываясь на общих колонках в таблицах.
Например, если ваша таблица tarifs выглядит так:
а потом есть таблица settings
То как видим получается вполне нормальная структуа, в первой таблице описаны тарифы, во второй настройки этих тарифов. К какому тарифу относятся те или иные настройки понятно из tarif_id. В итоге по этим двум таблицам довольно простым запросом можно получить полный перечень настроек с указанием тарифа.
Это я так понял, что вы хотели сделать.
Нет!
нЕТ, к сожалению все не так просто)
Я позже покажу вам структуру БД и вы поймете что я имел ввиду.