我正在使用多租户软件来管理产品库存,但我在创建查询以根据数量标准提供产品库存时遇到困难。
用例:从当前用户组织的所有仓库中获取所有产品及其所有库存,其中产品类型来自设备,仓库 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 |
根据给定的条件,
组织 abc、产品类型为
的预期结果和 仓库 warh65=0 且仓库 warh777>0appliances
我已经构建了这个查询,请告诉我我的理解是否正确。 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;
输出