SQL Server中使用INNER JOIN如何正确关联时段价格表并排除无关数据?
解决Table_A与Table_B按日期范围关联的INNER JOIN问题
看起来你已经离正确结果很近了!问题出在日期范围的匹配逻辑上——你之前用了A.Sales_Date > B.Valid_Price_From and A.Sales_Date < B.Valid_Price_To,这会漏掉刚好落在起始日或结束日的销售记录(比如20200601的Apple销售,对应Table_B里20200601开始的单价,用>就不满足)。
正确的做法是使用闭区间匹配,也就是让销售日期落在单价生效的起始日到结束日之间(包含两端),同时把这个条件和水果匹配一起放到JOIN的关联条件里(或者WHERE子句里,放到JOIN里逻辑更清晰)。
正确的查询语句
SELECT A.Sales_Date, A.Fruit, A.Quantity, B.Unit_Price, A.Total_Price FROM Table_A A INNER JOIN Table_B B ON A.Fruit = B.Fruit AND A.Sales_Date >= B.Valid_Price_From AND A.Sales_Date <= B.Valid_Price_To;
验证目标结果(Table_C)
执行上面的语句后,你会得到精准关联的结果:
| Sales_Date | Fruit | Quantity | Unit_Price | Total_Price |
|---|---|---|---|---|
| 20200515 | Apple | 2 | 2.0 | 4 |
| 20200601 | Apple | 4 | 2.5 | 10 |
| 20200601 | Banana | 4 | 1.8 | 7.2 |
| 20200606 | Orange | 6 | 1.3 | 7.8 |
为什么之前的语句不对?
- 第一次查询只关联了
A.Fruit = B.Fruit,没有日期过滤,会生成笛卡尔积(每条销售记录匹配该水果的所有单价记录),导致结果混乱。 - 第二次查询用了
<和>的开区间,导致刚好在生效起始日(比如20200601)的销售记录无法匹配到对应的单价,造成结果缺失。
用闭区间的匹配逻辑就能精准关联到每个销售记录对应的有效单价啦!
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

