我打算提交與@Squirrell幾乎一樣的東西,只用公用表表達式[CTE]而不是派生表。所以我不會重複,但有一些關於您的查詢的學習要點。首先是IMPLICIT JOINS
如FROM Bill_Item, Bill
真的很容易產生意想不到的後果(許多問題之一:Queries that implicit SQL joins can't do?)接下來對於計算列,您實際上可以在OUTER APPLY
或CROSS APPLY
中執行此操作,這是非常有用的技術。
SELECT *
FROM
Product p
OUTER APPLY (SELECT TOP 1 b.client_id
FROM
Bill_Item bi
INNER JOIN Bill b
ON bi.bill_id = b.bill_id
WHERE
bi.product_id = p.product_id
GROUP BY
b.client_id
ORDER BY
COUNT(*) DESC) c
,並說明squirell的回答怎麼還包括從未被出售所有你需要做的是加入的產品和LEFT JOIN要產品有:
所以你可以按如下方式重新寫你的方法其他表格:
;WITH cte AS (
SELECT
p.product_id
,b.client_id
,ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY COUNT(*) DESC) as RowNumber
FROM
Product p
LEFT JOIN Bill_Item bi
ON p.product_id = bi.product_id
LEFT JOIN Bill b
ON bi.bill_id = b.bill_id
GROUP BY
p.product_id
,b.client_id
)
SELECT *
FROM
cte
WHERE
RowNumber = 1
其中一些有用的技術。
- CTE
- 適用(外&十字)
- 窗口功能
您正在使用什麼版本的SQL
? –
SQL Server 2012 –
不確定它是否會優化查詢,但最好使用'JOIN',這樣您的查詢就可以更改爲'FROM Bill_Item INNER JOIN Bill Bill_Item.product_id = p.product_id 和Bill_Item.bill_id = Bill.bill_id'您可以使用SHOWPLAN來檢查執行計劃。 –