查询产品与客户匹配?

时间:2017-02-07 17:30:44

标签: sql sql-server select join matching

我们有各种各样的产品,每天都有很多产品。

客户可以注册电子邮件提醒。这些产品每晚都会大量发送,客户会收到符合他们所需产品的定制产品清单。

数据库中有三个相关表:

  • 帐户(pk_AccountID,EmailAddress,标题,名称)
  • Accounts_Alerts(fk_AccountID,pk_AlertID,Category,MaxPrice,Color)
  • 产品(pk_ItemID,类别,标题,价格,颜色,日期修改)

选择在过去24小时内添加的最新10种产品的最有效方法是什么?这些产品与每位客户选择的选项相匹配?

这是我到目前为止所做的,但是它并没有按日期选择前10个产品(即最新添加的产品)。我们不希望向客户发送30多种产品,以便通过电子邮件进行查看。

SELECT
   a.pk_AccountID,
   aa.pk_AlertID,
   a.Title As Title,
   a.Name As Name,       
   a.EmailAddress As EmailAddress,
   p.pk_ItemID As ItemID,
   p.Category As Category,
   p.Title As Title,
   p.Price As Price,
   p.Colour As Colour

   FROM dbo.Accounts_Alerts aa
   INNER JOIN dbo.Accounts a ON aa.fk_AccountID=a.pk_AccountID
   LEFT OUTER JOIN dbo.Products p ON 
   (aa.Category = p.Category OR aa.Category IS NULL)
   AND (aa.Colour = p.Colour OR aa.Colour IS NULL)       
   AND (aa.MaxPrice >= p.Price OR aa.MaxPrice IS NULL)
   AND getdate()-1 < p.DateModified

   WHERE
   a.EmailAddress is not null AND
   a.pk_AccountID = @AccountIDVariable
   ORDER BY aa.pk_AlertID

1 个答案:

答案 0 :(得分:2)

处理此问题的一种常见方法是使用窗口函数内联视图,SQL Server可以很好地处理它。

例如:

SELECT
   pk_AccountID,
   pk_AlertID,
   Title,
   Name,       
   EmailAddress,
   ItemID,
   Category,
   Title,
   Price,
   Colour
FROM (
    SELECT
       a.pk_AccountID,
       aa.pk_AlertID,
       a.Title As Title,
       a.Name As Name,       
       a.EmailAddress As EmailAddress,
       p.pk_ItemID As ItemID,
       p.Category As Category,
       p.Title As Title,
       p.Price As Price,
       p.Colour As Colour,
       ROW_NUMBER() over (
            partition by a.pk_AccountID, p.pk_ItemID 
            order by p.DateModified desc
       ) as rseq
    FROM dbo.Accounts_Alerts aa
    INNER JOIN dbo.Accounts a ON aa.fk_AccountID=a.pk_AccountID
    LEFT OUTER JOIN dbo.Products p ON 
        (aa.Category = p.Category OR aa.Category IS NULL)
        AND (aa.Colour = p.Colour OR aa.Colour IS NULL)       
        AND (aa.MaxPrice >= p.Price OR aa.MaxPrice IS NULL)
        AND getdate()-1 < p.DateModified
    WHERE
        a.EmailAddress is not null AND
        a.pk_AccountID = @AccountIDVariable
) as any_alias_will_do
where rseq <= 10
ORDER BY pk_AlertID

注意ROW_NUMBER()功能 - 你需要确保你正在“按分区”和“按”排序正确的标准(我在这里选择了帐户ID和项目ID,但你可能需要不同的字段) 。尝试单独运行内部查询,以帮助您了解其工作原理。

这种技术非常通用 - 建议您进一步阅读这些功能。