sql - 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数据:
- 第 1 行非常具体,将匹配所有 4 个连接列。
- 第 2 行不关心在 Target 使用什么浏览器购物,因此无论“浏览器”值如何,trans_fee 都应该返回相同的值(但其他商店可能会关心)。
- 第 3 行表示任何与 country='US' 和 store_name='Walmart' 的交易,不管其余的连接列将具有相同的 trans_fee
- 第 4 行是“其他”场景,它应该首先查看 store_name 列,如果找不到匹配项,请转到其他。
lookup_table 数据可能会发生变化,并且最终可能与时间相关(添加了 start_date 和 end_date 列),因此对于长而复杂的 CASE 语句来说,它确实不是一个好的候选者。
我正在考虑使用 IF IN 语句检查每一列的组合,但我希望有一个更直接的条件连接类型语句,我可以使用它来逐列检查并有其他选择。
谢谢!
编辑:我没有指定这一点,但我想基本上从 transaction_table 返回所有数据并将相应的 trans_fee 添加到每一行。
解决方案
您将需要使用有条件的 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
推荐阅读
- python - django url 可以在开头包含固定路径吗?
- android - 如何使用绑定适配器从 ImageView 中的 drawable 加载动画 gif?
- java - 无法为元素 Appenders 调用类 org.apache.logging.log4j.core.config.AppendersPlugin 中的工厂方法:java.lang.NullPointerException
- swift - 计算两个坐标之间的距离并将其显示在 UITableViewCell 的标签内
- java - 何时使用接口变量与实现变量
- elasticsearch - 在 Kibana 仪表板中使用 SQL
- python - 为什么我要为 Python 中数据框的每个索引获取列标题?
- c++ - 冒泡排序降序
- javascript - laravel 在提交表单时没有获取文件
- laravel - 重定向到 Laravel 路由 VueJS