通过临时表SQL Server连接

通过临时表SQL Server连接,sql,sql-server,database,sql-server-2008,select,Sql,Sql Server,Database,Sql Server 2008,Select,我有一张定价规则表。我正在使用以下查询检索每个ProductTypeID的最大折扣,该折扣指示产品的类型: SELECT MAX(discount) as BiggestDiscount, ProductTypeID FROM dbo.SellingPriceRules WHERE ProductTypeID is not null GROUP by ProductTypeID ORDER BY ProductTypeID 这非常有效,但是我需要在此基础上进行扩展,对于ProductIDs列表

我有一张定价规则表。我正在使用以下查询检索每个
ProductTypeID
的最大折扣,该折扣指示产品的类型:

SELECT MAX(discount) as BiggestDiscount, ProductTypeID FROM dbo.SellingPriceRules
WHERE ProductTypeID is not null
GROUP by ProductTypeID
ORDER BY ProductTypeID
这非常有效,但是我需要在此基础上进行扩展,对于
ProductID
s列表,请检索我的最大折扣。因此,我需要找到每个
ProductID
所属的
ProductID
并检查我的
SellPriceRules
数据库,以获取此
ProductTypeID
的最大折扣

因此,在我的
折扣表中,我有:

ProductID, Margin
ProductID, ProductTypeID
在我的
产品
表中,我有:

ProductID, Margin
ProductID, ProductTypeID
为了获得每个产品的ProductTypeID,我有:

select * from Discounts m
INNER JOIN Product p on p.ProductID = m.ProductID
WHERE ProductTypeID is not null
我现在正努力将这两个问题结合起来。我只是想得到折扣表中每种产品的最大折扣,然后从我的利润中减去这个。我怎样才能把这两个退休的人连在一起呢


非常感谢

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

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

使用相关子查询

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的执行计划


通常,您可以在这种情况下使用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

您可以尝试以下方法:

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

当您只需要内部连接而不需要内部连接时,使用相关子查询(将其重构为外部连接)会降低性能。首先,检查一下@Annon您对dbo.SellingPriceRules表的索引扫描操作有问题。考虑到您在SellingPriceRules中使用的示例数据,您遇到问题并不奇怪。