查找同时存在于两个指定数据源的匹配账户编号SQL求助
解决方案:找出符合条件的账户编号
这里提供两种易懂的SQL写法,你可以根据自己的数据库环境选择:
方法1:自连接匹配(直观易懂)
这种方法是把表和自己做关联,分别匹配abc和xyz数据源的记录:
SELECT DISTINCT t1.`account number` FROM Transaction t1 JOIN Transaction t2 ON t1.`account number` = t2.`account number` AND t1.`date` = t2.`date` AND t1.`sales` = t2.`sales` AND t1.source = 'abc' AND t2.source = 'xyz';
代码说明:
t1和t2是给同一张表起的别名,分别代表abc和xyz数据源的记录JOIN条件确保两个数据源的账户编号、日期、销售额完全一致DISTINCT用来避免同一个账户编号被重复输出
方法2:分组统计(简洁高效)
通过分组筛选同时存在两个数据源的记录:
SELECT `account number` FROM Transaction WHERE source IN ('abc', 'xyz') GROUP BY `account number`, `date`, `sales` HAVING COUNT(DISTINCT source) = 2;
代码说明:
- 先筛选出仅来自
abc和xyz的记录 - 按账户编号、日期、销售额分组,每组代表一组完全匹配的记录组合
HAVING COUNT(DISTINCT source) = 2确保每组同时包含abc和xyz两个数据源
排查未得到预期结果的常见原因
如果执行后没得到想要的结果,检查这几点:
- 字段名格式:如果字段名有空格(比如
account number),必须用反引号(MySQL)或方括号(SQL Server)包裹,否则数据库会识别错误 - 数据一致性:
- 日期字段:确认两个数据源的日期格式完全一致(比如
2024-05-20和2024/05/20会被判定为不同) - 销售额字段:如果是字符串类型,
100和100.0会被视为不同;如果是数值类型,要确保精度一致
- 日期字段:确认两个数据源的日期格式完全一致(比如
- 数据源拼写:检查
source字段的值是否准确,有没有大小写错误(比如ABC或Xyz),可以改成LOWER(source) IN ('abc', 'xyz')统一大小写匹配 - 重复记录:如果同一个数据源下有重复的账户+日期+销售额记录,不会影响结果,但自连接方法需要保留
DISTINCT去重
内容的提问来源于stack exchange,提问作者ravikumarpa4
相关产品推荐
相关产品推荐

