首页 > 解决方案 > SQL 帮助 - 加入不需要所有列的小型查找表(以及其他选项)

问题描述

我有一个包含事务的大表和一个较小的查找表,其中包含我想基于 4 个公共列添加的值。这里的技巧不是这 4 列的每个组合都会存在于查找表中,并且在某些情况下我希望它停止检查并接受匹配而不是转到下一列。如果它与任何选项都不匹配,我还有一个“其他”选项默认为。

表结构是这样的:

transaction_table
country, trans_id, store_type, store_name, channel, browser, purchase_amount, currency

lookup_table
country, store_name, channel, browser, trans_fee

数据可能是这样的:

transaction_table:

country| trans_id| store_type  |store_name  |channel |browser |amt  |currency
US     | 001     | Big Box     | Target     | B&M    |N/A     |1.45 |USD    
US     | 002     | Big Box     | Target     | Online |Chrome  |1.79 |USD   
US     | 003     | Small       | Bob's Store| B&M    |N/A     |2.50 |USD   
US     | 004     | Big Box     | Walmart    | B&M    |N/A     |1.12 |USD   
US     | 005     | Big Box     | Walmart    | Online |Firefox |3.79 |USD   
US     | 006     | Big Box     | Amazon     | Online |IE      |4.54 |USD   
US     | 007     | Small       | Jim's Plc  | B&M    |IE      |2.49 |USD 

lookup_table:
country|store_name  |channel |browser |trans_fee
US     |Target      |B&M     |N/A     |0.25   
US     |Target      |Online  |        |0.15
US     |Walmart     |        |        |0.30
US     |Other       |        |        |0.45

所以查看lookup_table数据:

lookup_table 数据可能会发生变化,并且最终可能与时间相关(添加了 start_date 和 end_date 列),因此对于长而复杂的 CASE 语句来说,它确实不是一个好的候选者。

我正在考虑使用 IF IN 语句检查每一列的组合,但我希望有一个更直接的条件连接类型语句,我可以使用它来逐列检查并有其他选择。

谢谢!

编辑:我没有指定这一点,但我想基本上从 transaction_table 返回所有数据并将相应的 trans_fee 添加到每一行。

标签: sqljoin

解决方案


您将需要使用有条件的 JOIN。

像这样的东西

SELECT * 
FROM lookup_table
LEFT OUTER JOIN transaction_table
ON CASE WHEN lookup_table.store_name IS NOT NULL 
THEN transacton_table.store_name = lookup_table.store_name END

推荐阅读