我对一件事很好奇。假设我有两个表,一个有销售和促销代码,另一个只有促销代码和属性。促销代码可以打开和关闭,但促销属性可以更改。表结构如下:
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请注意,这不是我的表/模式/设计。我不明白为什么他们不为属性的每个变化生成新的promo_cd,特别是当属性是我们想要测量的时候。不管怎么说,我正试着做一个像这样的表格:
sale promo_cd attribute
2 AAA fun
3 AAA fun
8 BBB boo
9 BBB boo
10 BBB green到目前为止,我所做的唯一一件事就是创建一个内部连接(这会导致重复的记录),然后通过比较销售日期和促销活动/非活动日期进行筛选。但是,有没有更好的方法呢?我真的很好奇,因为这是一个相当大的数据集,我希望保持它的效率。
发布于 2013-07-19 05:44:15
这是我喜欢将过滤条件直接放入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发布于 2013-07-19 05:45:04
假设我理解正确,您可以使用:
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日期永远不会重叠(考虑到他们选择的模式,这似乎是可能的)
发布于 2013-07-19 05:49:08
只需将日期添加到您的JOIN条件:
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演示:SQL Fiddle
https://stackoverflow.com/questions/17734301
复制相似问题