比 PostgreSQL 中相同 table 但不同条件的多个子查询更好的方法
Better way than multiple subquery for the same table but different criteria in PostgreSQL
例如,我可能有这样一个架构:
我想得到一些东西,比如:
| inventory_id | all_paid_merchandise_quantity | all_shipped_merchandise_quantity |
|--------------|-------------------------------|----------------------------------|
| 1 | 10 | 100 |
| 2 | 11 | 12 |
我已经想出了类似 all_paid_merchandise_quantity
的子查询和 all_shipped_merchandise_quantity
的子查询之类的东西。但是我想知道是否有更好的方法来做到这一点?
编辑:"ugly" 查询。
SELECT
inventory.id AS inventory_id,
(SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_shipped=true AND "order_items".merchandise_id=merchandise.id) AS all_shipped_merchandise_quantity,
(SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_paid=true AND "order_items".merchandise_id=merchandise.id) AS all_paid_merchandise_quantity
FROM
inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id
尝试:
SELECT
inventory.id AS inventory_id,
merchandise.id AS merchandise_id,
sum(order_items.quantity) FILTER (WHERE "order".has_shipped) AS all_shipped_merchandise_quantity,
sum(order_items.quantity) FILTER (WHERE "order".has_paid) AS all_paid_merchandise_quantity
FROM
inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
LEFT JOIN "order_items" ON "order_items".merchandise_id=merchandise.id
LEFT JOIN "order" ON (order_items.order_id="order".id AND ("order".has_shipped OR "order".has_paid))
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id
例如,我可能有这样一个架构:
我想得到一些东西,比如:
| inventory_id | all_paid_merchandise_quantity | all_shipped_merchandise_quantity |
|--------------|-------------------------------|----------------------------------|
| 1 | 10 | 100 |
| 2 | 11 | 12 |
我已经想出了类似 all_paid_merchandise_quantity
的子查询和 all_shipped_merchandise_quantity
的子查询之类的东西。但是我想知道是否有更好的方法来做到这一点?
编辑:"ugly" 查询。
SELECT
inventory.id AS inventory_id,
(SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_shipped=true AND "order_items".merchandise_id=merchandise.id) AS all_shipped_merchandise_quantity,
(SELECT sum(order_items.quantity) FROM "order" LEFT JOIN "order_items" ON order_items.order_id="order".id WHERE "order".has_paid=true AND "order_items".merchandise_id=merchandise.id) AS all_paid_merchandise_quantity
FROM
inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id
尝试:
SELECT
inventory.id AS inventory_id,
merchandise.id AS merchandise_id,
sum(order_items.quantity) FILTER (WHERE "order".has_shipped) AS all_shipped_merchandise_quantity,
sum(order_items.quantity) FILTER (WHERE "order".has_paid) AS all_paid_merchandise_quantity
FROM
inventory
LEFT JOIN merchandise ON merchandise.inventory_id=inventory.id
LEFT JOIN "order_items" ON "order_items".merchandise_id=merchandise.id
LEFT JOIN "order" ON (order_items.order_id="order".id AND ("order".has_shipped OR "order".has_paid))
GROUP BY inventory.id, merchandise.id
ORDER BY inventory.id