如何在SQL中内连接两个匿名表
能否对两个INNER JOIN的结果再做INNER JOIN?
当然可以!这两个通过INNER JOIN得到的结果本质上都是关系型结果集,只要它们之间存在可以用来关联的字段(或者字段组合),就完全可以对这两个结果集再做一次INNER JOIN。
举个实际例子说明
假设我们的三张表结构大概是这样:
person:person_id(主键)、nameautos:auto_id(主键)、owner_id(关联person.person_id)、car_modelnumbers:number_id(主键)、auto_id(关联autos.auto_id)、phone_number
你已经得到的两个结果集:
person与autos的INNER JOIN结果(记为A):包含用户信息和对应的车辆信息autos与numbers的INNER JOIN结果(记为B):包含车辆信息和对应的联系电话
我们可以通过auto_id(两个结果集都包含的字段)将A和B做INNER JOIN,得到用户-车辆-联系电话的完整关联数据。
具体SQL实现方式
方式1:使用子查询
SELECT * FROM ( -- 第一个INNER JOIN的结果(结果集A) SELECT p.person_id, p.name, a.auto_id, a.car_model FROM person p INNER JOIN autos a ON p.person_id = a.owner_id ) AS joined_person_autos INNER JOIN ( -- 第二个INNER JOIN的结果(结果集B) SELECT a.auto_id, a.car_model, n.phone_number FROM autos a INNER JOIN numbers n ON a.auto_id = n.auto_id ) AS joined_autos_numbers ON joined_person_autos.auto_id = joined_autos_numbers.auto_id;
方式2:使用CTE(更易读)
WITH joined_person_autos AS ( SELECT p.person_id, p.name, a.auto_id, a.car_model FROM person p INNER JOIN autos a ON p.person_id = a.owner_id ), joined_autos_numbers AS ( SELECT a.auto_id, a.car_model, n.phone_number FROM autos a INNER JOIN numbers n ON a.auto_id = n.auto_id ) SELECT * FROM joined_person_autos INNER JOIN joined_autos_numbers ON joined_person_autos.auto_id = joined_autos_numbers.auto_id;
额外提醒
- 必须有可关联的字段:如果两个结果集没有任何可以匹配的字段,INNER JOIN会返回空结果,这点要注意。
- 避免列名冲突:如果两个结果集有同名字段(比如都有
car_model),查询时要明确指定所属的结果集别名,或者给字段起别名区分。 - 更高效的替代方案:其实你完全可以直接将三张表一次性做INNER JOIN,这样数据库能更好地优化查询计划,性能通常比先生成两个中间结果再JOIN更好:
SELECT p.person_id, p.name, a.auto_id, a.car_model, n.phone_number FROM person p INNER JOIN autos a ON p.person_id = a.owner_id INNER JOIN numbers n ON a.auto_id = n.auto_id;
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

