在PostgreSQL中使用多个左联接

时间:2018-11-05 16:32:28

标签: postgresql

我是计算机领域的新手,我正在研究SQL。我在PostgreSql中使用多个联接查询。我正在尝试制作库存管理系统。我有3张桌子,如下所示:

  1. inventory_limit_stock:id(int,PK),inventory_id(varchar),product_id(int),min_stock_limit(int)
  2. product_inventory:id(int,PK),inventory_id(int),product_id(int),in_stock(int)
  3. 其他库存:id(int,PK),product_id,A(int),B(int),C(int)

因此,我想显示库存量少于表1中设置的最低限额的产品的列表。表1中的inventory_id包含数字或'A','B','C'的值。如果是数字,则引用表2,否则引用表1。因此,例如,如果表1的inventory_id包含值2,它将检查表2并获得in_stock值。如果它包含值'A',则它参考表3中的列A,并将采用其中的值。 我尝试了以下查询,但对我没有用。

SELECT ils.product_id as limit_prod, ils.inventory_id as limit_inv from inventory_limit_stock ils 
left join product_inventory as pi on pi.product_id = ils.product_id 
left join other_inventory oi on oi.product_id = ils.product_id 
where (COALESCE(ils.min_stock_limit,0) > COALESCE(SUM(pi.in_stock), SUM(oi.limit_inv), 0)) group by ils.product_id, ils.inventory_id

我知道查询中有太多错误,我们将不胜感激。也为这个冗长的问题感到抱歉,这是我在这里的第一个问题,希望大家都理解。谢谢。

编辑

表1-stock_limit_stock

id | product_id | inventory_id | min_stock_limit
1  |    121     |      5       |       25
2  |    052     |      B       |       27
3  |    8       |      13      |       11
4  |    121     |      13      |       35

表2-product_inventory

id | product_id | inventory_id | in_stock
1  |    121     |      5       |    42
2  |    742     |      15      |    12
3  |    8       |      13      |    09
4  |    121     |      13      |    25

表3-其他库存

id | product_id |  A  | B  | C
1  |    121     |  42 | 12 | 11
2  |    052     |  42 | 25 | 25

结果列表 (应显示产品入库数量<最小限制的列表)

product_id | inventory | minimum_stock_limit | in_stock_available
    8      |     13    |        11           |        9
   121     |     13    |        35           |        25
   052     |     B     |        27           |        25

1 个答案:

答案 0 :(得分:1)

对于汇总结果,应使用Have而不是where

SELECT ils.product_id as limit_prod
  , ils.inventory_id as limit_inv 
from inventory_limit_stock ils 
left join product_inventory as pi on pi.product_id = ils.product_id 
left join other_inventory oi on oi.product_id = ils.product_id 
group by ils.product_id, ils.inventory_id
HAVING (COALESCE(ils.min_stock_limit,0) >COALESCE(SUM(pi.quantity), SUM(oi.limit_inv), 0)) 

having子句处理select ..的结果,其中处理表..

中的原始值