SQL查询:获取两表中cust_zip匹配但cust_id不匹配的关联数据
需求匹配的最优SQL实现
首先明确这个需求的核心计算逻辑:我们要以交易表t2的store_id、cust_zip组合为输出锚点,在客户表t1中找同邮编、且客户ID和t2当前记录不相等的客户,最终输出指定三个字段的结果集。
逻辑校验匹配度
对照示例数据逐行过一遍关联过程,就能对应上预期结果:
- t2中
cust_zip=19999的记录:匹配到t1同邮编的客户ID是1000,和t2自身的cust_id=1000相等,不满足“cust_id不相等”的条件,被排除 - t2中
cust_zip=29999的记录:匹配到t1同邮编的客户ID是2000,和t2自身的cust_id=2000相等,同样被排除 - t2中
cust_zip=39999的记录:匹配到t1同邮编的客户ID是4000,和t2自身的cust_id=3000不相等,完全符合筛选要求 - t1中
cust_zip=89999的记录:在t2中根本没有同邮编的匹配项,内连接逻辑会自动跳过这条记录,完全符合补充说明的排除规则
最优SQL写法
直接使用内连接,把两个筛选条件直接写在关联子句中,不需要额外嵌套、子查询:
SELECT t2.store_id, t2.cust_zip, t1.cust_id FROM t2 INNER JOIN t1 ON t1.cust_zip = t2.cust_zip AND t1.cust_id != t2.cust_id
为什么这是最优写法
- 驱动表选t2完全贴合输出字段的来源:我们最终要取的两个字段
store_id、cust_zip全部来自t2,内连接会自动过滤掉t1里没有匹配邮编的孤立记录(比如示例里的89999邮编记录),不需要额外加WHERE条件做二次过滤 - 把筛选条件写在
ON子句中,数据库优化器可以在关联扫描阶段就把不满足要求的记录直接剔除,不用先把两表笛卡尔积的全量结果拉到内存里再筛选,执行效率远高于把条件放在WHERE的写法 - 如果提前给
t1.cust_zip建立普通索引,这个写法可以直接通过索引定位同邮编的客户记录,不需要全表扫描t1,在数据量百万级以上的场景下,性能比其他带子查询、去重逻辑的写法高一个量级
内容的提问来源于stack exchange,提问作者Caerus
相关产品推荐
相关产品推荐

