将INNER JOIN替换为NATURAL JOIN后查询结果不一致的问题
解决INNER JOIN转NATURAL JOIN后结果不一致的问题
你的问题出在子查询丢弃了关联所需的关键字段:原INNER JOIN通过person_order.person_id = person.id关联,但你写的子查询只提取了order_date,导致NATURAL JOIN找不到同名的关联字段,最终执行了笛卡尔积,结果和原查询不符。
要实现和原INNER JOIN完全一致的逻辑,NATURAL JOIN需要依赖同名的关联字段自动匹配。因此你需要将person_order的person_id重命名为id(和person表的主键字段名一致),再执行NATURAL JOIN。
正确的SQL语句
SELECT po.order_date, p.name || ' (' || 'age:' || p.age || ')' AS person_information FROM ( SELECT order_date, person_id AS id FROM person_order ) AS po NATURAL JOIN person p ORDER BY 1, 2;
逻辑说明
- 子查询将
person_order的person_id重命名为id,和person表的主键字段名保持一致 NATURAL JOIN会自动识别这个同名的id字段作为关联条件,等价于原INNER JOIN的person_order.person_id = person.id- 最终查询结果和原
INNER JOIN完全一致
内容的提问来源于stack exchange,提问作者Evgeny Step
相关产品推荐
相关产品推荐

