【问题标题】:Joining over an interim table SQL Server通过临时表连接 SQL Server
【发布时间】:2013-07-09 22:12:40
【问题描述】:

我有一张定价规则表。我正在检索每个ProductTypeID 的最大折扣,这表明产品是哪种类型,使用此查询:

SELECT MAX(discount) as BiggestDiscount, ProductTypeID FROM dbo.SellingPriceRules
WHERE ProductTypeID is not null
GROUP by ProductTypeID
ORDER BY ProductTypeID

这很好用,但是我需要对此进行扩展,对于ProductIDs 的列表,请检索我最大的折扣。所以我需要找到每个ProductID 所属的ProductTypeID 并检查我的SellPriceRules 数据库以获取此ProductTypeID 的最大折扣。

所以,在我的Discounts 表中,我有:

ProductID, Margin

在我的Products 表中我有:

ProductID, ProductTypeID

为了获取每个产品的 ProductTypeID,我有:

select * from Discounts m
INNER JOIN Product p on p.ProductID = m.ProductID
WHERE ProductTypeID is not null

我现在正在努力将这两个查询结合在一起。我只是想获得折扣表中每种产品的最大折扣,然后从我的利润中减去。我怎样才能将这两个退休人员联合起来?

非常感谢

【问题讨论】:

    标签: sql sql-server database sql-server-2008 select


    【解决方案1】:

    使用相关子查询

    SELECT m.ProductID, m.Margin, p.ProductTypeID, 
      m.Margin - (SELECT MAX(discount) 
                  FROM dbo.SellingPriceRules 
                  WHERE ProductTypeID = p.ProductTypeID)
    FROM Discounts m INNER JOIN Product p on p.ProductID = m.ProductID
    WHERE p.ProductTypeID IS NOT NULL
    

    @Annon 的执行计划

    【讨论】:

    • 当您只需要内部联接时,使用相关子查询(重构为外部联接)会降低性能
    • 我不同意。首先,检查一下!
    【解决方案2】:

    你可以试试这样的:

    select *, Margin-BiggestDiscount from Discounts m
    INNER JOIN Product p on p.ProductID = m.ProductID AND p.ProductTypeID is not null
    inner join (
    SELECT MAX(discount) as BiggestDiscount, ProductTypeID 
    FROM dbo.SellingPriceRules
    GROUP by ProductTypeID) as r on p.ProductTypeID = r.ProductTypeID
    

    【讨论】:

      【解决方案3】:

      一般情况下,您可以在这种情况下使用 CTE。像这样的:

      ;WITH current_discounts (BiggestDiscount, ProductTypeID)
      AS (
          SELECT MAX(discount) as BiggestDiscount, ProductTypeID FROM dbo.SellingPriceRules
          WHERE ProductTypeID is not null
          GROUP by ProductTypeID
          ORDER BY ProductTypeID
      )
      
      SELECT
          m.ProductID,
          m.Margin - c.BiggestDiscount
      FROM Discounts m
      INNER JOIN Product p ON p.ProductID = m.ProductID
      INNER JOIN current_discounts c ON p.ProductTypeID = c.ProductTypeID
      

      【讨论】:

        【解决方案4】:

        你的所有逻辑都是正确的。您只需要将一个查询嵌入另一个查询的语法。

        SELECT
          p.ProductID,
          p.ProductTypeID,
          m.Margin,
          d.BiggestDiscount,
          m.Margin - d.BiggestDiscount AS AdjustedMargin
        FROM Product p
        INNER JOIN Discounts m ON (p.ProductID = d.ProductID)
        INNER JOIN (
          SELECT
            ProductTypeID,
            MAX(discount) as BiggestDiscount
          FROM SellingPriceRules
          GROUP BY ProductTypeID
        ) d ON (p.ProductTypeID = d.ProductTypeID)
        WHERE p.ProductID IS NOT NULL
        

        【讨论】:

        • @Annon 您对 dbo.SellingPriceRules 表的索引扫描操作有问题。sqlfiddle.com/#!3/4f986/1
        • 鉴于您在 SellingPriceRules 中使用的示例数据,我对您遇到问题并不感到惊讶。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多