2016-11-19 66 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

相關問題