Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массив в подзапросе. / 9 сообщений из 9, страница 1 из 1
11.10.2008, 21:51
    #35589692
toanton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
есть две таблицы:


структура первой
Таблица "public.test"
Колонка | Тип | Модификаторы
----------+-----------+--------
id | integer |
steps_id | integer[] |

данные из первой
id | steps_id
----+-----------
1 | {2,4,6,8}
2 | {3,5,7,9}
4 | {9,8,7}
3 | {3,4,5}
(записей: 4)


структура второй
Таблица "public.steps"
Колонка | Тип | Модификаторы
------+------------------------+----------------------------------------------------
id | integer | not null default nextval('steps_id_seq'::regclass)
step | character varying(255) |

данные из второй
id | step
----+---------
1 | step 1
2 | step 2
3 | step 3
4 | step 4
5 | step 5
6 | step 6
7 | step 7
8 | step 8
9 | step 9
10 | step 10
11 | step 11
12 | step 12
13 | step 13
14 | step 14
15 | step 15
(записей: 15)




требуется написать запрос, чтобы запрашивая по id из первой таблицы получать перечень шагов из второй.

запрос SELECT step FROM steps WHERE id = ANY(ARRAY[2,5,7]); делает, что мне надо, но у меня не получается вместо ARRAY[2,5,7] подставить SELECT steps_id FROM test WHERE id = 2
...
Рейтинг: 0 / 0
12.10.2008, 12:21
    #35589885
toanton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
эту задачу решил, но возникла ещё более сложная. т.к. надо выводить записи из таблицы steps именно в той последовательности в которой они представлены в массиве, пришлось сделать массив массивов вида {{1,10}, {2,11} , {3,12}, {4,13}, {5,14}, {6,15}} где первые элементы показывают порядковый номер (чтоб по ним можно было сортировать) а вторые id для связки с таблицой steps.
...
Рейтинг: 0 / 0
13.10.2008, 12:05
    #35590909
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
Если такая задача, то проще сделать составной тип и массив составного типа в первой таблице. Вторая таблица не нужна. Вы одним запросом получите одну запись, в которой будет содержаться вся информация о шагах, в нужном Вам порядке.
...
Рейтинг: 0 / 0
13.10.2008, 12:35
    #35590990
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
toantonструктура первой
Таблица "public.test"
Колонка | Тип | Модификаторы
----------+-----------+--------
id | integer |
steps_id | integer[] |

данные из первой
id | steps_id
----+-----------
1 | {2,4,6,8}
2 | {3,5,7,9}
4 | {9,8,7}
3 | {3,4,5}
(записей: 4)используйте вместо массивов таблицу связей
...
Рейтинг: 0 / 0
13.10.2008, 14:55
    #35591397
toanton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
большое спасибо откликнувшимся.

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

CREATE TYPE steps_array AS (id INT, sort_order INT);

CREATE TABLE test3 (id INT, steps_id steps_array[]);
ERROR: type "steps_array[]" does not exist


LeXa NalBat
в задаче я упустил, что мне надо хранить историю. т.е. мне гораздо удобней хранить в первой таблице массив или созданный тип чем некое количество записей с одинаковыми id, но если ничего с составными типами не получится придется так и сделать. Имея одну строку я могу у id использовать тип SERIAL, а так придется лочить таблицу и придумывать, что то с приращением id.
...
Рейтинг: 0 / 0
13.10.2008, 15:04
    #35591428
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
toantonв задаче я упустил, что мне надо хранить историю. т.е. мне гораздо удобней хранить в первой таблице массив или созданный тип чем некое количество записей с одинаковыми id, но если ничего с составными типами не получится придется так и сделать. Имея одну строку я могу у id использовать тип SERIAL, а так придется лочить таблицу и придумывать, что то с приращением id.не надо "лочить таблицу и придумывать, что то с приращением id"

test ( id serial primary key, name text )
steps ( id serial primary key, name text )
test_steps ( ordr serial primary key, test_id integer references test.id, step_id integer references steps.id )
...
Рейтинг: 0 / 0
14.10.2008, 17:34
    #35594142
MySQLCraft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
toantonбольшое спасибо откликнувшимся.

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

CREATE TYPE steps_array AS (id INT, sort_order INT);

CREATE TABLE test3 (id INT, steps_id steps_array[]);
ERROR: type "steps_array[]" does not exist


LeXa NalBat
в задаче я упустил, что мне надо хранить историю. т.е. мне гораздо удобней хранить в первой таблице массив или созданный тип чем некое количество записей с одинаковыми id, но если ничего с составными типами не получится придется так и сделать. Имея одну строку я могу у id использовать тип SERIAL, а так придется лочить таблицу и придумывать, что то с приращением id.

Обнови версию. В 8.3.4 это работает.
...
Рейтинг: 0 / 0
18.10.2008, 21:47
    #35602641
toanton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
да, спасибо разобрался. обновил до 8.3. массивы созданных мной типов заработали. все создал, но не знаю как их дергать, и вообще закрались сомнения в правильности хода моих мыслей. :)

поясню задачу целиком т.к. изначально описал только часть.

таблица 1 (список столов)
table_id - id стола
version - версия (для истории)
table_desc - описание стола
box_id - какой ящик прикреплен к столу (в данной версии)

таблица 2
box_id ящика в столе
items_array[] массив предметов хранящихся в ящике стола (структура массива: id предмета, sort_order его порядковый номер т.к. выводить предметов надо в опр. последовательности)

таблица 3
id предмета
item_desc описание предмета


основная возникшая сложность, это как лучше хранить историю. Можно было бы хранить все без массивов, но при любом изменении в перечне предметов или их количестве пришлось бы создавать кучу записей, а так создается только одна запись с массивом, но зато возникает проблема как построить въюху с последними версиями предметов в столе.
...
Рейтинг: 0 / 0
21.10.2008, 12:58
    #35606372
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
массив в подзапросе.
структура БД без использования массивов

table1
(table_id,version) -- primary key
box_id -- references table2
table_desc

table2
box_id -- primary key

table3
item_id -- primary key
item_desc

table4
box_id -- references table2
item_id -- references table3
(box_id,item_id) -- primary key
sort_order -- порядковый номер item_id внутри данного box_id
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / массив в подзапросе. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]