【发布时间】:2016-02-11 18:43:06
【问题描述】:
从this article,作者决定使用WITH替换这种方式使用的子查询:
SELECT c.CategoryName, p.ProductName, p.UnitPrice
FROM Categories c
INNER JOIN (SELECT CategoryId, MAX(UnitPrice) AS MaxPrice
FROM Products GROUP BY CategoryId) maxprice
ON maxprice.CategoryId = c.CategoryId
INNER JOIN Products p
ON p.CategoryId = c.CategoryId
AND p.UnitPrice = maxprice.MaxPrice
ORDER BY MaxPrice DESC
这是作者的查询结果:
WITH MostExpensiveProducts (CategoryId, MaxUnitPrice) AS
(
SELECT CategoryId, MAX(UnitPrice)
FROM Products
GROUP BY CategoryId
)
SELECT c.CategoryName, p.ProductName, p.UnitPrice
FROM Categories c
INNER JOIN MostExpensiveProducts mep
ON mep.CategoryId = c.CategoryId
INNER JOIN Products p
ON p.CategoryId = mep.CategoryId
AND p.UnitPrice = mep.MaxUnitPrice
ORDER BY mep.MaxUnitPrice DESC;
现在这篇文章已经超过 6 年了,但它仍然与我相关,因为我使用的是 SQL Server 2008。但是,我围绕替换子查询的大部分搜索结果都涉及JOINS。这让我很困惑,因为这里的子查询已经在 INNER JOINs 中。
这个使用WITH 的解决方案今天仍然有效吗?有没有更好的方法来解决这个问题?
【问题讨论】:
-
您并没有真正删除子查询,只是使用 CTE,这对很多人来说提高了可读性
-
@Lamak 这就是我的想法。现在是否有替换此类子查询的实际解决方案?
-
您认为实际的解决方案是什么?它和这个有什么不同?我不清楚你的目标是什么。
-
@TabAlleman 对不够清晰感到抱歉。关于涉及
WITH的解决方案,Lamak 表示它并没有真正删除子查询.. 那么是否有一个解决方案可以删除不涉及WITH的子查询?
标签: sql-server join sql-server-2008-r2 subquery