2014-02-20 3 views
0

Условие:Postgresql. выберите значение SUM из массивов

Есть две таблицы с массивами.

Примечание food.integer и price.food_id указанный массив.

CREATE TABLE food (
    id integer[] NOT NULL, 
    name character varying(255), 
); 
INSERT INTO food VALUES ('{1}', 'Apple'); 
INSERT INTO food VALUES ('{1,1}', 'Orange'); 
INSERT INTO food VALUES ('{1,2}', 'banana'); 

и

CREATE TABLE price (
    id bigint NOT NULL, 
    food_id integer[], 
    value double precision DEFAULT 0 
); 
INSERT INTO price VALUES (44, '{1}', 500); 
INSERT INTO price VALUES (55, '{1,1}', 100); 
INSERT INTO price VALUES (66, '{1,2}', 200); 

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

ОТВЕТ: {1} - Apple - 800 (500 + 100 + 200)

+0

Если вы нормализуете свою модель данных, это станет очень простым запросом. Хранение ссылок на внешние ключи в массиве - не очень хорошая идея. Вы должны действительно рассмотреть возможность фиксации вашей модели данных. –

+0

Да, но я не эту базу разработал. Если вы знаете запрос к этой базе данных, напишите или скажите мне, где искать. – Theb

+0

Почему я знаю, что вы скажете нам, что вы этого не сделали? Люди, создающие неправильные модели данных, по-видимому, никогда не должны их использовать. Я не понимаю массив идентификаторов в таблице «food». Означает ли это, что «банан» имеет два разных идентификатора? И почему у Orange есть те же идентификаторы, что и Apple? И что это значит, что у «оранжевого» и «банана» есть * два * ids. Каков первичный ключ таблицы «еда»? Модель и данные не имеют для меня никакого смысла. –

ответ

1

Что об этом:

select 
    name, 
    sum(value) 
from 
    (select unnest(id) as food_id, name from food) food_cte 
    join (select distinct id, unnest(food_id) as food_id, value from price) price_cte using (food_id) 
group by 
    name 

Это трудно понять ваш вопрос, но этот запрос, по крайней мере, возвращает 800 для Apple.

+0

Да, это так! Мне нужна только группировка по еде.ID, а не food.name :( – Theb

+0

Отлично, Спасибо! – Theb

0

попробовать следующую команду,

SELECT F.ID,F.NAME,SUM(P.VALUE) FROM FOOD F,PRICE P WHERE F.ID=P.FOOT_ID; 
+0

Потребность в деталях для продукта: Apple - 800 (500 + 100 + 200); Orange - ...; Банан - ...; – Theb

+0

нет цены на яблоко в вашем ценовом столе. –

+0

Какая цена price.value для яблок? 800 (500 + 100 + 200) или другой? – Theb

Смежные вопросы