使用subquery实现多表JOIN操作是否可行?
结论
可以通过子查询实现你需要的多表关联效果,以下是两种符合SQL规范的实现方式,效果和你给出的三表INNER JOIN完全一致:
方式1:关联子查询+WHERE条件过滤
这种写法和你之前用IN子查询实现两表JOIN的逻辑一脉相承,额外通过关联子查询获取其他表的字段:
SELECT (SELECT f_name FROM honstudent WHERE honstudent.s_id = students.student_id) AS f_name, students.student_id, students.master_teacher, (SELECT full_name FROM teacher WHERE teacher.id = students.master_teacher) AS full_name FROM students WHERE -- 过滤出同时存在于honstudent表的学生记录 students.student_id IN (SELECT s_id FROM honstudent) -- 过滤出有对应主课老师的学生记录 AND students.master_teacher IN (SELECT id FROM teacher)
说明:你提到的「子查询不允许返回超过一列」是对WHERE条件中子查询的限制,这里SELECT后的关联子查询每次仅返回对应行的单个字段,符合语法要求。
方式2:FROM子句派生表实现
如果更习惯多表匹配的逻辑,可以把每个表的查询作为子查询放在FROM子句中,再通过WHERE条件做关联:
SELECT t1.f_name, t2.student_id, t2.master_teacher, t3.full_name FROM (SELECT s_id, f_name FROM honstudent) AS t1, (SELECT student_id, master_teacher FROM students) AS t2, (SELECT id, full_name FROM teacher) AS t3 WHERE t1.s_id = t2.student_id AND t2.master_teacher = t3.id
说明:FROM后的派生表属于子查询的一种,允许返回多列结果,没有列数限制。
补充建议
实际开发中更推荐使用原生JOIN写法,不仅可读性更高,数据库优化器对JOIN语句的执行计划优化也更成熟,运行效率通常会比多层子查询实现更好。
内容的提问来源于stack exchange,提问作者Surendra Anand
相关产品推荐
相关产品推荐

