我怎樣才能改變這個查詢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