我正在查询学校作业,其中我选择低于最低库存的产品,然后我选择以最低价格提供每种产品的供应商。
这些是桌子。
+------------+
+------------------+
+------------+
| products |
| product_overview |
| provider |
+------------+
+------------------+
+------------+
| productID |
| productID |
| providerID |
| name |
| providerID |
| name |
| stock |
| price |
+------------+
| min_stock |
+------------------+
+------------+
这是我目前所拥有的。
SELECT p.name, pr.name
FROM products p JOIN product_overview po ON p.productID = po.productID
JOIN provider l ON po.providerID = pr.providerID
WHERE p.stock < p.min_stock
GROUP BY po.productID
ORDER BY p.name;
我先查找哪些产品具有 stock < min_stock
,然后再查找提供商。目前,输出中给出的提供商不是以最低价格提供产品的提供商。
答案 0 :(得分:1)
您可以按如下方式使用 not exists
:
SELECT p.name, pr.name provider_name, po.price
FROM products p JOIN product_overview po ON p.productID = po.productID
JOIN provider pr ON po.providerID = pr.providerID
WHERE p.stock < p.min_stock
AND not exists
(select 1 from product_overview poo
where poo.productID = po.productID
and poo.price < po.price)
答案 1 :(得分:0)
最简单的方法是使用窗口函数:
SELECT pp.*
FROM (SELECT p.name as product_name, pr.name as provider_name,
ROW_NUMBER() OVER (PARTITION BY p.productID ORDER BY po.price ASC) as seqnum
FROM products p JOIN
product_overview po
ON p.productID = po.productID JOIN
provider pr
ON po.providerID = pr.providerID
WHERE p.stock < p.min_stock
) pp
WHERE seqnum = 1
ORDER BY p.name;