You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中内连接两个匿名表

能否对两个INNER JOIN的结果再做INNER JOIN?

当然可以!这两个通过INNER JOIN得到的结果本质上都是关系型结果集,只要它们之间存在可以用来关联的字段(或者字段组合),就完全可以对这两个结果集再做一次INNER JOIN。

举个实际例子说明

假设我们的三张表结构大概是这样:

  • person:person_id(主键)、name
  • autos:auto_id(主键)、owner_id(关联person.person_id)、car_model
  • numbers:number_id(主键)、auto_id(关联autos.auto_id)、phone_number

你已经得到的两个结果集:

  1. person与autos的INNER JOIN结果(记为A):包含用户信息和对应的车辆信息
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:52:47