java找出价格最低_SQL查询查找每个零件的最低价格的供应商

我需要找到每个零件价格最低的供应商。

表:供应商(sid、sname、地址)、零件(pid、pname、颜色)、目录(sid、pid、成本)

这是有效的:SELECT

sname, pid

FROM

(SELECT

*

FROM

suppliers

NATURAL JOIN catalog

NATURAL JOIN (SELECT

pid, MIN(cost) AS min_cost

FROM

catalog

GROUP BY (pid)) AS m

HAVING cost = min_cost) AS n

但是,当我试图将其缩短为以下值时,我得到一个错误,即having子句中存在未知的成本:

SELECT

sname, pid

FROM

suppliers

NATURAL JOIN

catalog

NATURAL JOIN

(SELECT

pid, MIN(cost) AS min_cost

FROM

catalog

GROUP BY (pid)) AS m

HAVING cost = min_cost

为什么找不到成本?表中的成本不是因为我已将子查询加入目录吗?

编辑

根据建议,我将其改为使用INNER JOIN,而不是NATURAL JOIN,但仍然会出现相同的错误。新查询:

SELECT

s.sname, m.pid

FROM

suppliers s

INNER JOIN

catalog c ON s.sid = c.sid

INNER JOIN

(SELECT

pid, MIN(cost) AS min_cost

FROM

catalog

GROUP BY (pid)) AS m ON c.pid = m.pid

HAVING cost = min_cost

编辑2

问题不是JOIN而是HAVING,正如bbrumm的回答所示,实际上应该是WHERE。

最佳答案:

我建议这样一个问题:SELECT

supplier.sname,

catalog.pid

FROM suppliers

INNER JOIN catalog ON suppliers.supplier_id = catalog.supplier_id

INNER JOIN

(SELECT

pid, MIN(cost) AS min_cost

FROM catalog

GROUP BY (pid)) AS m

ON catalog.pid = m.pid

WHERE catalog.cost = m.min_cost;

我对您的列名(如供应商id)做了一些假设,您可能需要更改。可以指出,“cost=min_cost”是连接的一部分,因此它也可以到达那里。我也没有包含表别名,因为虽然这是最佳实践,但不是必需的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值