我有一张带有产品的桌子和一张带有购买的桌子。 我想显示前十名产品列表并按
订购列表这是一个小例子。请注意它如何完整扫描产品表
在此示例中,用户只购买了一个产品('产品X'),因此该产品应位于此列表的顶部。
http://sqlfiddle.com/#!18/48e19/1
有任何建议我如何改进这一点,以便查询速度快,不扫描整个表格?
如果需要,我可以更改数据库布局和/或索引。
更新 下面的代码使查询更快,但我仍然很好奇,如果可以这样做而不必拥有所有这些多个查询。
;WITH purchased_products AS (
SELECT ProductId FROM Purchases WHERE AccountId = @AccountId
)
SELECT top 10 * FROM (
SELECT TOP 10 ProductId as Id FROM purchased_products
UNION ALL
SELECT TOP 10 Id FROM Products WHERE Id NOT IN (SELECT ProductId FROM purchased_products) ORDER BY Name
) t
答案 0 :(得分:0)
我认为这可以解决您的问题:
DECLARE @AccountId UNIQUEIDENTIFIER = 'F621080F-031E-4B8B-89F0-793DD9DFF8A2'
select top 10 prds.id, prds.name from Products prds
LEFT JOIN Purchases pu ON prds.Id = pu.ProductId AND pu.AccountId = @AccountId
ORDER BY pu.ProductId desc, prds.Name desc
通过稍微更改LEFT JOIN和ORDER BY,您可以减少扫描整个表格的需要。