为何执行该SQL查询后两列结果完全一致?26日与31日疫苗接种数据本应存在差异
为啥你的SQL返回的疫苗数据完全相同?
嘿,我来帮你拆解这个问题——你遇到的异常其实是NATURAL JOIN的特性搞的鬼,好多人刚用的时候都会踩这个坑!
核心原因:NATURAL JOIN的自动匹配逻辑
NATURAL JOIN的规则很“死板”:它会自动把两个表中所有名称相同的列都作为等值连接的条件,而不是只按你心里默认的“主键列”(比如国家/地区编码、名称这类用来匹配同一实体的列)来关联。
你的两个表vaccination_data_26th和vaccination_data_31st里都有total_vaccinations这个列,所以数据库执行NATURAL JOIN时,会把这个列也偷偷加入到连接条件里。相当于它帮你写了这样的SQL:
SELECT v26.total_vaccinations, v31.total_vaccinations FROM vaccination_data_26th v26 JOIN vaccination_data_31st v31 ON v26.匹配列 = v31.匹配列 -- 假设这是你本来想用来关联的列,比如country_code AND v26.total_vaccinations = v31.total_vaccinations;
这下就懂了吧?只有那些两个表中total_vaccinations数值完全相等的行才会被筛选出来,返回的结果里这两列当然一模一样;而那些实际数值不同的行,直接被这个额外的连接条件过滤掉了,你根本看不到它们。
怎么解决?显式指定连接条件就好
要正确对比26日和31日的接种数据,你得主动告诉数据库应该用什么列来关联两个表:
- 先找到两个表中用来唯一匹配同一地区/国家的列(比如
country_code、region_name这类不会随日期变化的标识列) - 用
JOIN ... ON显式写连接条件,比如:
SELECT v26.total_vaccinations AS total_26th, v31.total_vaccinations AS total_31st FROM vaccination_data_26th v26 JOIN vaccination_data_31st v31 ON v26.country_code = v31.country_code;
这样就能准确关联同一地区的记录,看到两天的数据差异了。
顺便提一句:NATURAL JOIN虽然看起来省事,但只要表结构新增了同名列,就可能导致连接条件意外变化,所以实际开发里更推荐显式写连接条件,可读性和稳定性都强得多。
内容的提问来源于stack exchange,提问作者Shubonil__
相关产品推荐
相关产品推荐

