从两个表中对值进行排序

时间:2018-03-28 12:39:27

标签: sql-server query-performance

我有一张带有产品的桌子和一张带有购买的桌子。 我想显示前十名产品列表并按

订购列表
  1. 当前用户购买的产品
  2. 按产品名称排序
  3. 这是一个小例子。请注意它如何完整扫描产品表

    在此示例中,用户只购买了一个产品('产品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
    

1 个答案:

答案 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,您可以减少扫描整个表格的需要。