【问题标题】:Using correlated subquery and MAX使用相关子查询和 MAX
【发布时间】:2013-02-08 02:26:25
【问题描述】:

我有两张桌子:

InventoryPart

PartNumber、PartDescription、CategoryID、EOQ、StockPrice、 ReorderLevel、StockLevel、StockOnOrder、权重

CustOrderLine

OrderID、PartNumber、UnitPrice、OrderQuantity、折扣、状态

我只需要返回每个类别中最昂贵的库存零件的 PartNumber、PartDescription、StockPrice 和 CategoryID

这是迄今为止我想出的最好的......

SELECT IP.PartNumber, IP.PartDescription, IP.CategoryID, IP.StockPrice
FROM InventoryPart IP, CustOrderLine COL
WHERE IP.PartNumber = COL.PartNumber
AND COL.UnitPrice IN
  (SELECT MAX(COL.UnitPrice)
   FROM CustOrderLine COL)

此代码的问题在于它返回所有类别的 MAX UnitPrice,而不是按类别分隔

我已经被这个问题困扰了几个小时,我觉得我现在做的弊大于利。非常感谢您的帮助。

【问题讨论】:

标签: sql max correlated-subquery


【解决方案1】:

这样的事情应该使用子查询来获取与每个 CategoryId 关联的MAX UnitPrice。

SELECT DISTINCT IP.*
FROM InventoryPart IP
   JOIN CustOrderLine COL ON IP.PartNumber = COL.PartNumber
   JOIN (
    SELECT IP.CategoryID, MAX(COL.UnitPrice) MaxPrice
    FROM InventoryPart IP INNER JOIN
        CustOrderLine COL ON IP.PartNumber = COL.PartNumber
    GROUP BY IP.CategoryID
   ) T ON IP.CategoryId = T.CategoryId AND COL.UnitPrice = T.MaxPrice

这是一个减少的Fiddle,它显示了每个类别单价最高的库存零件。

祝你好运。

【讨论】:

  • sgeddes,非常感谢您的帮助。我还要感谢您向我介绍 SQL Fiddle。非常好的工具!
  • @Christf -- 不用担心,很高兴我能帮上忙。祝你好运!
【解决方案2】:

这是一个简单的版本。

SELECT  a.PartNumber, a.PartDescription, a.CategoryID, a.StockPrice
FROM    InventoryPart a
        INNER JOIN
        (
            SELECT  PartNumber, MAX(StockPrice) max_price
            FROM    Inventorypart
            GROUP   BY PartNumber
        ) b ON  a.partNumber = b.PartNumber AND
                a.StockPrice = b.max_price

为了获得更好的性能,请在 (PartNumber, StockPrice) 列上添加 INDEX

ALTER TABLE InventoryPart ADD INDEX (PartNumber, StockPrice)

更新 1

SELECT  a.PartNumber, a.PartDescription, a.CategoryID, a.StockPrice
FROM    InventoryPart a
        INNER JOIN
        (
            SELECT  PartNumber, CategoryID, MAX(StockPrice) max_price
            FROM    Inventorypart
            GROUP   BY PartNumber, CategoryID
        ) b ON  a.partNumber = b.PartNumber AND
                a.StockPrice = b.max_price AND
                a.CategoryID = b.CategoryID

ALTER TABLE InventoryPart ADD INDEX (PartNumber, StockPrice, CategoryID)

【讨论】:

  • 这假设 StockPrice 和 UnitPrice 是相同的值,但就像我的回答一样。干得好。
  • 非常感谢,JW。我选择 sgeddes 的答案作为“接受的答案”的原因是因为您的代码将 StockPrice 和 UnitPrice 假定为相同的值。除此之外,它对我来说效果很好。谢谢! :)
  • 不要认为这行得通——按零件编号分组不会返回您的最高价格——见小提琴:sqlfiddle.com/#!3/f0b43/2——仅按 categoryId 分组。亲切的问候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2020-07-07
  • 2020-11-15
  • 2019-10-23
相关资源
最近更新 更多