在PostgreSQL上互连表

时间:2018-04-27 20:01:15

标签: postgresql

我是新手。

我正在使用PostgreSQL来处理我特定研究领域的大量数据。不幸的是,我遇到了一个不允许我继续分析的问题。我试图简化我的问题以清楚地说明它。

假设我有一张名为"买家"这些数据: table_buyers

买家只能在每家商店购买一件商品,或者不购买。有三家商店,每个商店都有一张桌子。如下所示:

table_store1

table_store2

table_store3

要创建表,我使用以下代码:

CREATE TABLE public.buyer
(
ID integer NOT NULL PRIMARY KEY,
name text NOT NULL, 
phone text NOT NULL
) 
WITH (
  OIDS = FALSE
)
;

CREATE TABLE public.Store1
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;


CREATE TABLE public.Store2
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;


CREATE TABLE public.Store3
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;

要在表格上添加信息,我使用以下代码:

INSERT INTO buyer (ID, name, phone) VALUES
    (1, 'Alex', 88888888),
    (2, 'Igor', 77777777),
    (3, 'Mike', 66666666);

INSERT INTO Store1 (ID_buyer, total_order, total_itens) VALUES
    (1, 87.45, 8),
    (2, 14.00, 3),
    (3, 12.40, 4);

INSERT INTO Store2 (ID_buyer, total_order, total_itens) VALUES
    (1, 785.12, 7),
    (2, 9874.21, 25);

INSERT INTO Store3 (ID_buyer, total_order, total_itens) VALUES
    (2, 45.87, 1);

由于所有表都按买方的ID互连,我希望我能有一个生成输出的查询,如下所示: desired output table

请注意,如果买家没有在商店购买任何东西,我必须打印' 0'

我知道这是一项轻松的任务,但不幸的是,我一直未能完成它。

使用' AND'逻辑运算符,我尝试了以下代码来完成此任务:

SELECT 
  buyer.id, 
  buyer.name, 
  store1.total_order, 
  store2.total_order, 
  store3.total_order
FROM 
  public.buyer, 
  public.store1, 
  public.store2, 
  public.store3
WHERE 
  buyer.id = store1.id_buyer AND
  buyer.id = store2.id_buyer AND
  buyer.id = store3.id_buyer;

但是,显然,它刚刚回归'伊戈尔'因为这是在所有三家商店(print screen)购买商品的唯一买家。

然后,我尝试了' OR'逻辑运算符,就像下面的代码一样:

SELECT 
  buyer.id, 
  buyer.name, 
  store1.total_order, 
  store2.total_order, 
  store3.total_order
FROM 
  public.buyer, 
  public.store1, 
  public.store2, 
  public.store3
WHERE 
  buyer.id = store1.id_buyer OR
  buyer.id = store2.id_buyer OR
  buyer.id = store3.id_buyer;

但是,它会返回12行错误值(print screen)。

显然,我的错误在于不考虑买家'不要在我的代码上的所有三个商店。我不能自己纠正它,你能帮助我吗?

我非常感谢能够照亮我的方式的答案。非常感谢!

我也非常欢迎有关如何搜索此问题的提示!

1 个答案:

答案 0 :(得分:0)

确定。我怀疑这是你的最终答案,但它是一个开始

SELECT 
  buyer.id, 
  buyer.name, 
  COALESCE( gb_store1.total_orders, 0 ) as store1_total, 
  COALESCE( gb_store2.total_orders, 0 ) as store2_total, 
  COALESCE( gb_store3.total_orders, 0 ) as store3_total
FROM
  public.buyer, 
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store1
     GROUP BY ID_buyer ) gb_store1 ON gb_store1.id_buyer = buyer.id ,
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store2
     GROUP BY ID_buyer ) gb_store2 ON gb_store2.id_buyer = buyer.id ,
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store3
     GROUP BY ID_buyer ) gb_store3 ON gb_store3.id_buyer = buyer.id ;

所以,这个查询有几个应该关注的元素。子选择/ groupby允许您通过ID_buyer在子表中进行总计。 LEFT OUTER JOIN使它成为您的查询仍然可以返回结果,即使子查找没有找到匹配的记录。最后,当你的一个总数为NULL时,COALESCE允许你返回0(因为子选择找不到匹配)。

希望这有帮助。

相关问题