查询 posgresql 数据连接具有复合 id 和连接表的多个条件的表

问题描述 投票:0回答:1

我正在使用多租户软件来管理产品库存,但我在创建查询以根据数量标准提供产品库存时遇到困难。

用例:从当前用户组织的所有仓库中获取所有产品及其所有库存,其中产品类型来自设备,仓库 x 中的数量为 0,仓库 y 中的数量 >0

组织

abc
、产品类型为
appliances
、仓库
warh65=0
和仓库
warh777>0
的预期结果将是一系列产品,其库存属性列出了该产品的所有仓库库存,而不仅仅是正在查询的库存,例如:

[
 {
   product_id: producta,
   ...product,
   inventory:[
     {warehouse_id:warh65, warehouse_quantity: 0},
     {warehouse_id:warh098, warehouse_quantity: 5},
     {warehouse_id:warh777, warehouse_quantity: 1},
   ]
 },
]

这里是我现在的重点,它带来了一个带有

producta
productc
的数组,但是它并没有列出其他仓库的其余库存,只列出了正在查询的库存。如果我为另一个仓库添加第二个条件,则返回的数组为空。

使用 Postgresql

SELECT p.*, JSON_AGG(row(i.inven_warehouse_id, i.inventory_quantity)) as inventory
FROM products AS p
INNER JOIN inventory AS i
ON p.product_id = i.inven_product_id
WHERE p.product_org = orgabc AND p.product_type='appliances' AND (i.inven_warehouse_id='warn65' AND i.inventory_quantity=0)
GROUP BY p.product_id

这是表格和关系的视觉辅助工具。预先感谢您的帮助。

产品_id 产品组织 产品类型 产品_...
产品 有机BC 电器
产品b 有机BC 手动工具
产品c 有机BC 手动工具
org_id org_...
有机BC
orgxyz
仓库_id warehouse_org 仓库名称
warh65 有机BC 这个
warh098 有机BC 那个
warh777 有机BC 那个
warh523 orgxyz 那个
warhhgy orgxyz 那个
inven_warehouse_id inven_产品_id 库存数量
warh65 产品 0
warh098 产品 5
warh777 产品 2
warh65 产品b 3
warh098 产品b 1
warh777 产品b 0
warh65 产品c 0
warh098 产品c 1
warh777 产品c 1
sql postgresql join inner-join
1个回答
0
投票

根据给定的条件,

组织 abc、产品类型为

appliances
的预期结果和 仓库 warh65=0 且仓库 warh777>0

我已经构建了这个查询,请告诉我我的理解是否正确。 Fiddle 目前似乎已关闭,所以我无法与您分享实时链接。

WITH filtered_products AS (
  SELECT 
    p.product_id,
    p.product_org,
    p.product_type,
    JSON_AGG(
      DISTINCT 
      JSONB_BUILD_OBJECT(
        'warehouse_id', i.inven_warehouse_id, 
        'warehouse_quantity', i.inventory_quantity
      )
    ) AS inventory
  FROM 
    products AS p
  INNER JOIN 
    inventory AS i ON p.product_id = i.inven_product_id
  INNER JOIN
    warehouse AS w ON i.inven_warehouse_id = w.warehouse_id
  WHERE 
    p.product_org = 'orgabc' 
    AND p.product_type = 'appliances'
    AND EXISTS (
      SELECT 1 
      FROM inventory 
      WHERE inven_product_id = p.product_id 
      AND inven_warehouse_id = 'warh65' 
      AND inventory_quantity = 0
    )
    AND EXISTS (
      SELECT 1 
      FROM inventory 
      WHERE inven_product_id = p.product_id 
      AND inven_warehouse_id = 'warh777' 
      AND inventory_quantity > 0
    )
  GROUP BY 
    p.product_id, p.product_org, p.product_type
)
SELECT 
  'orgabc' AS organization,
  JSON_AGG(
    JSONB_BUILD_OBJECT(
      'product_id', fp.product_id,
      'product_org', fp.product_org,
      'product_type', fp.product_type,
      'inventory', fp.inventory
    )
  ) AS products
FROM 
  filtered_products fp;

输出

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.