通过临时表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中使用的示例数据,您遇到问题并不奇怪。