2014-02-07 5 views
0

У меня проблема со связанными таблицами и мне нужен совет, как сделать запрос в соответствии с моими потребностями. Вот два примера таблицы:PostgreSQL, выпуск со связанными таблицами

ПРЕДУПРЕЖДЕНИЕ
Убедитесь, что вы не имеете ваши собственные таблицы с именем TEMP1 и/или tempclasses1 иначе вы потеряете его навсегда, запустив этот пример!

DROP TABLE IF EXISTS temp1; 
CREATE TEMP TABLE temp1 
     (food_code int, food_name text, qty integer, tclass integer, meas text); 
INSERT INTO temp1 (food_code, food_name, qty, tclass, meas) 
VALUES (10, 'spaghetti',  3, 1, 'pcs'), 
     (156, 'mayonnaise',  2, 0, 'pcs'), 
     (173, 'ketchup',   1, 2, 'pcs'), 
     (172, 'bolognese sauce', 2, 1, 'pcs'), 
     (173, 'ketchup',   1, 0, 'pcs'), 
     (175, 'worchester sauce', 2, 3, 'pcs'), 
     (177, 'parmesan',   1, 2, 'pcs'), 
     (178, 'jam',    1, 4, 'pcs'), 
     (10, 'spaghetti',  2, 3, 'pcs'), 
     (156, 'mayonnaise',  1, 0, 'pcs'); 

    DROP TABLE IF EXISTS tempclasses1; 
CREATE TABLE tempclasses1 
     (class_code int, class_name text); 
INSERT INTO tempclasses1 (class_code, class_name) 
VALUES (1, 'first class'), 
     (3, 'third class'), 
     (4, 'fourth class'); 

Теперь мне нужно сгруппировать и суммировать данные из первой таблицы в соответствии с классами, которые находятся во второй таблице.
Я делаю это FITH следующий запрос:

SELECT tclass, MAX(class_name), SUM(qty) 
    FROM temp1 
    JOIN tempclasses1 t ON tclass=t.class_code 
GROUP BY tclass 
ORDER BY tclass; 

... и получить такой результат:

1  "first class"  5 
3  "third class"  4 
4  "fourth class"  1 

вопрос с тем, что мне нужна сумма всех классов в результате даже те, которые не являются определенном в таблице tempclasses1. Например:

0      4 
1  "first class"  5 
2      2 
3  "third class"  4 
4  "fourth class"  1 

Как получить код с кодом, похожим на мой запрос?

ответ

2

Вы хотите LEFT JOIN:

SELECT 
    tclass 
    ,class_name 
    ,SUM(qty) 
FROM temp1 t1 
LEFT JOIN tempclasses1 t 
    ON t1.tclass=t.class_code 
GROUP BY 
    tclass 
    ,class_name 
ORDER BY 
    tclass 
; 

Смотрите эту SQL Fiddle.

+0

Какой трюк! На целый день я не смог прийти к этому :) Спасибо! –

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