LINUX.ORG.RU

Postgres: Выборка строки таблицы а не поля (mytab а не mytab.id)


0

0

Случайно обнаружил что при исполнении запроса

select cro.id,il1
from
Tcustomer_request_orders cro
left join Titem_lines il1 on cro.item_by_customer_id=il1.id
where cro.id=2216;


Выдаётся следущий результат:
id | il1
------+----------------------------------------------------------------------------------------------------------------------------------
2216 | (2407,«2009-11-21 15:32:23.834486»,«2009-11-21 15:32:23.834486»,5,MAX971CUA+,120,1,,2,3,,1,,«need in week 49, »,,,0,,,MAX971CUA)
(1 row)


Захотелось понять, можно ли каким-то образом использовать результат, то есть получить на выходе в DBD::pg (например) не строку il1 а структуру?

★★★

а можно ли обычную таблицу(отношение) преобразовать в структуру?
здесь получается отношение из столбцов двух типов типа id(int новерное) и типа другого отношения считать неохота > 15 колонок

можно наверное какой-то тип объектный организовать
а чем, собственно, примечательна таблица, содержащая другую таблицу?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

ну просто у меня сейчас задачка есть некоторая, я хочу усложнить запрос, точнее сделать 1 запрос вместо 4.

у меня (условно говоря) сперва делается
select a_id,b_id,c_id from Ttable1;
а потом делается
select * from Ttable2 where id=:a_id;
select * from Ttable2 where id=:b_id;
select * from Ttable2 where id=:c_id;

так можно было бы выбрать:
select
(select * from Ttable2 t2 where t2.id=t1.a_id) as a_data,
(select * from Ttable2 t2 where t2.id=t1.b_id) as b_data,
(select * from Ttable2 t2 where t2.id=t1.c_id) as c_data
from Ttable1 t1;

и потом уже как-то лазить по a_data, b_data...

конечно можно написать по другому:
select
t1.*,
t2_a.id as a_id,
t2_a.name as a_name,
....
from
Ttable1 t1
left join Ttable2 t2_a on t2.id=t1.a_id
left join Ttable2 t2_b on t2.id=t1.b_id
left join Ttable2 t2_c on t2.id=t1.c_id
;
то есть развернуть структуру всю, но мне чего-то не хочется, не удобно будет и ООООЧЕНЬ длинно.

vahvarh ★★★
() автор топика

В нормальном случае, твое сообщение должнобыло выглядеть примерно так:

> Случайно обнаружил что при исполнении запроса

> select cro.id,il1

> from Tcustomer_request_orders cro

> left join Titem_lines il1 on cro.item_by_customer_id=il1.id

> where cro.id=2216;


... по ошибке не выдается exception что "поле il1 не найдено". Куда багрепортить про ошибку?

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

судя по всему это не бага а фича. то есть сделано намеренно и соответственно появляется желание эту фичу проэксплуатировать.

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

> судя по всему это не бага а фича

Я тебе могу рассказать про множество аналогичных фич от оракла, сана, ибм, хп и эппл. Правда при этом надо еще рассказать про вариант рабства, порождаемый этими фичами, но тогда меня шоман забанит

no-dashi ★★★★★
()
Ответ на: комментарий от vahvarh

тебе нужно использовать связанный подзапрос если я правильно понимаю

я так с ходу не смогу правильный запрос составить

dimon555 ★★★★★
()
Ответ на: комментарий от no-dashi

>по ошибке не выдается exception что "поле il1 не найдено".
это фича реляционной модели, нигде нет ограничения, что столбец не может содержать переменную отношения

dimon555 ★★★★★
()
Ответ на: комментарий от vahvarh

>так можно было бы выбрать:
>select

>(select * from Ttable2 t2 where t2.id=t1.a_id) as a_data,

>(select * from Ttable2 t2 where t2.id=t1.b_id) as b_data,

>(select * from Ttable2 t2 where t2.id=t1.c_id) as c_data

>from Ttable1 t1;


а этот запрос работает?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

> это фича реляционной модели, нигде нет ограничения, что столбец не может содержать переменную отношения

в mysql не может :) select a from a; ERROR 1054 (42S22): Unknown column 'a' in 'field list'

Eshkin_kot ★★
()
Ответ на: комментарий от maxcom

>в реляционной модели как раз такого нет, это противоречит 1-й нормальной форме
в восьмом издании "Введение в системы баз данных" страница 214

Атрибуты со значениями в виде отношения
и картинка в виде таблице, в столбце которой содержатся другие таблицы

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

> в восьмом издании «Введение в системы баз данных» страница 214

И примером там, конечно, Microsoft (r) Access (tm), верно? :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>И примером там, конечно, Microsoft (r) Access (tm), верно? :-)
там 1300 страниц теоритических изысканий без привязки к системе СУБД и SQL, я так и неосилил читается тяжело.

там есть отличие таблиц от отношений и сравнение реляционной алгебры и реляционного исчисления и то, что SQL сочитает черты и того и другого.

dimon555 ★★★★★
()
Ответ на: комментарий от no-dashi

Таблица может содержать дубликаты строк, а отношение не содержит дубликаты кортежей.

т.е. таблицы в отличие от отношений могут и не находиться в 1НФ

p.s. просто интересный факт из книги

dimon555 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.