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

如何编写SQL实现两张学生表全连接并完整展示所有数据?

正确SQL写法及说明

先假设两张表的典型结构(若你的表结构不同,仅需调整对应字段名即可):

  • Table A:student_id, student_name, course
  • Table B:student_id, student_name, course

核心思路

用FULL JOIN保留所有匹配/不匹配的学生记录,同时通过COALESCE()函数合并两张表中的学生标识字段(ID、姓名),避免仅存在于单表中的学生信息显示为NULL;最后用数据库对应的字符串聚合函数合并同一学生的所有课程信息。

分数据库实现代码

1. PostgreSQL / SQL Server

SELECT
    COALESCE(a.student_id, b.student_id) AS student_id,
    COALESCE(a.student_name, b.student_name) AS student_name,
    STRING_AGG(DISTINCT COALESCE(a.course, b.course), ', ') AS courses
FROM TableA a
FULL JOIN TableB b
    ON a.student_id = b.student_id
GROUP BY COALESCE(a.student_id, b.student_id), COALESCE(a.student_name, b.student_name);

2. MySQL

SELECT
    COALESCE(a.student_id, b.student_id) AS student_id,
    COALESCE(a.student_name, b.student_name) AS student_name,
    GROUP_CONCAT(DISTINCT COALESCE(a.course, b.course) SEPARATOR ', ') AS courses
FROM TableA a
FULL JOIN TableB b
    ON a.student_id = b.student_id
GROUP BY COALESCE(a.student_id, b.student_id), COALESCE(a.student_name, b.student_name);

关键细节说明

  • COALESCE(a.student_id, b.student_id):优先取Table A的学生ID,若为NULL则取Table B的,确保学生标识始终有值,这是解决Chris数据显示NULL的核心。
  • 聚合函数前加DISTINCT是为了避免同一课程因两表重复记录而多次显示。
  • 若你的表用student_name作为关联键(不推荐,优先用唯一ID),只需将ON条件改为a.student_name = b.student_name即可。

内容的提问来源于stack exchange,提问作者Bing Hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:57:37