如何编写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
相关产品推荐
相关产品推荐

