PostgreSQL,连接表的问题

时间:2014-02-07 19:33:28

标签: 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');

现在我需要根据第二个表中的类对第一个表中的数据进行分组和求和 我在查询后执行此操作:

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

我如何使用类似于我的查询的代码获得它?

1 个答案:

答案 0 :(得分: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