数据库查询 - 找到最昂贵的部分

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

这是我的架构供应商(sid,sname,地址)Cata(sid,pid,cost)零件(pid,pname,color)

粗体是主键我试图写一个查询“找到最昂贵的部分的pids”我在使用设置差异这里是我的查询但是它返回目录中的所有pids而不是具有最高成本的那个

select Cata.pid 
from Cata 
where pid not in(
    select c.pid 
    from Cata c, Cata f 
    where c.sid=f.sid AND c.pid=f.pid AND c.cost<f.cost
);
sql performance tsql schema
5个回答
1
投票

试试这个:

select c1.pid 
from Cata c1
where not exists (
    select c2.pid 
    from Cata c2 
    where c2.cost > c1.f.cost
);

如果您想知道查询有什么问题,请注意内部SELECT返回0行,因为您要将项目的成本与自己进行比较,因此c.cost总是等于f.cost,因此<comparation失败,因此内部选择返回0行,因此对于所有行,“not in”条件为真


1
投票

如果你想要最高成本的pid:

SELECT TOP 1 WITH TIES
    c.pid,
    c.cost
FROM
    Cata AS c
ORDER BY 
    c.cost DESC

如果您想要五个最高成本的pid,请将其第一行更改为:

SELECT TOP 5 WITH TIES

0
投票

我想这就是你要找的东西

    SELECT
     p.PID
     , MAX(c.COST)

    FROM
     Parts p
    LEFT JOIN
     Cata c
    ON p.PID = c.PID

    GROUP BY
     p.PID

    ORDER BY
     MAX(c.COST)

这将返回每个PID最昂贵的部分

祝好运!


0
投票

你想要

找到最昂贵零件的pids

由于你没有清楚地提到你的要求,

我给出了2个解决方案

  1. 解决方案1:为每个供应商找到最广泛的部件
  2. 解决方案2:在所有部件中找到最昂贵的部件

使用哪个适合你。

解决方案1:

SELECT Cata.pid FROM Cata
LEFT OUTER JOIN (SELECT Cata.sid, MAX(Cata.cost) cost FROM Cata GROUP BY Cata.sid) MostExpensive
ON Cata.sid = MostExpensive.sid AND Cata.cost = MostExpensive.cost

查询说明:

  • 首先,您应该尝试根据每个sid的成本找到最昂贵的东西
  • 然后,一旦你得到了最昂贵的表派生,找到匹配同一sid中的成本的pids。
  • 如果最昂贵的2个部分之间存在联系,则此查询将返回两个部分的pids。

解决方案2:如果您在所有供应商中寻找最广泛的部件,那么查询可以简化如下。

SELECT Cata.pid FROM Cata
WHERE Cata.cost = (SELECT MAX(cost) cost FROM Cata)

0
投票

找到最昂贵零件的pids

最昂贵的部件是最低成本最高的部件,即你可以得到所有其他部件比你必须至少支付xxx $的那些便宜。你可以通过热门查询得到这些。

select top(1) with ties
  pid
from cata
group by pid
order by min(cost) desc;

插图:

pid | supplier A | supplier B | supplier C
----+------------+------------+-----------
p1  |        10$ |        10$ |       100$
p2  |        40$ |        50$ |        60$

哪一部分更贵?我可以买10美元的p1。对于p2,我必须支付至少40美元。所以p2更贵。那个供应商C想要一个令人发指的100美元用于p1并不重要,因为谁会支付100美元购买10美元的东西?所以这是我们必须比较的最低价格。

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