我怎样才能改变这个查询bellow使用联接,而不是子查询?如何通过连接实现而不是使用子查询?
SELECT ID, Name, UnitPrice
FROM Products
WHERE UnitPrice <
(SELECT AVG(UnitPrice) FROM Products)
ORDER BY UnitPrice DESC;
感谢
我怎样才能改变这个查询bellow使用联接,而不是子查询?如何通过连接实现而不是使用子查询?
SELECT ID, Name, UnitPrice
FROM Products
WHERE UnitPrice <
(SELECT AVG(UnitPrice) FROM Products)
ORDER BY UnitPrice DESC;
感谢
另一种选择是使用的窗口功能
;with cte as (
SELECT ID
, Name
, UnitPrice
, AvgPrice = avg(UnitPrice) over (Order By (Select NULL))
FROM Products
)
Select * from cte where UnitPrice<AvgPrice
@Mou窗口功能非常棒,值得你花时间去适应它们。 –
是的,但在这种情况下,与标量值相比,效果不佳。在这种情况下,CTE引擎必须计算所有行的新列,然后进行比较。 – Deadsheep39
有办法做到这与加入如下所示:
SELECT T1.*
FROM [dbo].[Table_1] AS T1
INNER JOIN (SELECT AVG(Number) as Number FROM [Table_1]) AS T2
ON T1.Number < T2.Number
ORDER BY T1.UnitPrice DESC;
否则,使用变量来存储这个值
与连接上你可以做到这一点
或可以使用:
但是你的qry是最明确的解决方案。
最清楚取决于你在说谁。此外,对查询中的每一行运行查询的影响可能会显着降低。始终将SQL视为关系语言,并在可能的情况下处理数据集。 –
我正在谈论主题所有者的子查询。与标量值相比较,易于阅读。 – Deadsheep39
是你在找什么??? 'select T1。* FRom [dbo]。[Table_1] AS T1 INNER JOIN(SELECT AVG(Number)as Number FROM [Table_1])AS T2 ON T1.Number
Hadi