2016-11-19 32 views
1

我怎样才能改变这个查询bellow使用联接,而不是子查询?如何通过连接实现而不是使用子查询?

SELECT ID, Name, UnitPrice 
FROM Products 
WHERE UnitPrice < 
    (SELECT AVG(UnitPrice) FROM Products) 
ORDER BY UnitPrice DESC; 

感谢

+0

是你在找什么??? 'select T1。* FRom [dbo]。[Table_1] AS T1 INNER JOIN(SELECT AVG(Number)as Number FROM [Table_1])AS T2 ON T1.Number Hadi

回答

2

另一种选择是使用的窗口功能

;with cte as (
    SELECT ID 
     , Name 
     , UnitPrice 
     , AvgPrice = avg(UnitPrice) over (Order By (Select NULL)) 
    FROM Products 
) 
Select * from cte where UnitPrice<AvgPrice 
+0

@Mou窗口功能非常棒,值得你花时间去适应它们。 –

+1

是的,但在这种情况下,与标量值相比,效果不佳。在这种情况下,CTE引擎必须计算所有行的新列,然后进行比较。 – Deadsheep39

1

有办法做到这与加入如下所示:

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; 

否则,使用变量来存储这个值

0

与连接上你可以做到这一点

  • 随着CTE。
  • 用派生表。
  • 随助视图。
  • 带助手临时表。
  • 加入分组子查询。

或可以使用:

  • 随着变量。
  • 具有表格功能。
  • 与交叉适用。

但是你的qry是最明确的解决方案。

+1

最清楚取决于你在说谁。此外,对查询中的每一行运行查询的影响可能会显着降低。始终将SQL视为关系语言,并在可能的情况下处理数据集。 –

+0

我正在谈论主题所有者的子查询。与标量值相比较,易于阅读。 – Deadsheep39

相关问题