涉及日期代码时的SQL连接

涉及日期代码时的SQL连接,sql,Sql,我有点好奇。假设我有两个表,一个有销售和促销代码,另一个只有促销代码和属性。促销代码可以打开和关闭,但促销属性可以更改。以下是表格结构: tblSales tblPromo sale promo_cd date promo_cd attribute active_dt inactive_dt 2 AAA 1/1/2013 AAA "fun" 1/1/2013 1/1/3001

我有点好奇。假设我有两个表,一个有销售和促销代码,另一个只有促销代码和属性。促销代码可以打开和关闭,但促销属性可以更改。以下是表格结构:

tblSales                    tblPromo
sale  promo_cd  date        promo_cd  attribute   active_dt  inactive_dt
  2     AAA    1/1/2013        AAA      "fun"      1/1/2013    1/1/3001
  3     AAA    6/2/2013        BBB      "boo"      1/1/2013    6/1/2013
  8     BBB     2/2/2013       BBB      "green"    6/2/2013    1/1/3001
  9     BBB     2/3/2013
  10    BBB     8/1/2013
请注意,这不是我的表/模式/设计。我不明白为什么他们不为属性的每一个变化制作新的促销cd,尤其是当属性是我们想要衡量的时候。不管怎样,我正在尝试制作一张如下所示的桌子:

sale  promo_cd   attribute
  2     AAA        fun
  3     AAA        fun
  8     BBB        boo
  9     BBB        boo
  10    BBB        green

到目前为止,我所做的唯一一件事就是创建一个内部连接(这会导致重复记录),然后通过比较销售日期和促销活动/非活动日期进行过滤。不过,有没有更好的办法?我真的很好奇,因为这是一个相当大的数据集,我希望保持它的效率。

这是我喜欢将筛选条件直接放入JOIN子句的情况之一。至少在我的大脑中,重复的记录永远不会进入结果集。这就剩下WHERE子句用于实际过滤条件

Select s.sale, s.promo_cd, p.attribute
From tblSales s
  Inner Join tblPromo p 
    on s.promo_cd=p.promo_cd 
    and s.date between p.active_dt and p.inactive_dt

这是我喜欢将过滤条件直接放入JOIN子句的情况之一。至少在我的大脑中,重复的记录永远不会进入结果集。这就剩下WHERE子句用于实际过滤条件

Select s.sale, s.promo_cd, p.attribute
From tblSales s
  Inner Join tblPromo p 
    on s.promo_cd=p.promo_cd 
    and s.date between p.active_dt and p.inactive_dt

假设我理解正确,您可以使用:

SELECT s.sale, s.promo_cd, p.attribute
    FROM tblSales s
    JOIN tblPromo p ON p.promo_cd = s.promo_cd AND s.date BETWEENp.active_dt and p.inactive_dt

这假设tblPromo日期永远不会重叠(考虑到他们选择的模式,这似乎很可能)

假设我正确理解您,您可以使用:

SELECT s.sale, s.promo_cd, p.attribute
    FROM tblSales s
    JOIN tblPromo p ON p.promo_cd = s.promo_cd AND s.date BETWEENp.active_dt and p.inactive_dt

这假设tblPromo日期永远不会重叠(考虑到他们选择的模式,这似乎很可能)

只需将日期添加到您的
加入标准:

SELECT a.sale, a.promo_cd, b.attribute
FROM tblSales a
JOIN tblPromo b
   ON a.promo_cd = b.promo_cd
   AND a.date BETWEEN b.active_dt AND b.inactive_dt

演示:

只需将日期添加到您的
加入标准中即可:

SELECT a.sale, a.promo_cd, b.attribute
FROM tblSales a
JOIN tblPromo b
   ON a.promo_cd = b.promo_cd
   AND a.date BETWEEN b.active_dt AND b.inactive_dt

演示:

那么基本上你需要在日期列上连接两个表?那么基本上你需要在日期列上连接两个表?谢谢,我应该意识到可以这样做。再次感谢你的建议。谢谢你,我应该意识到这是可以做到的。再次感谢你的建议。