技术求助:从3张表创建无重复输出的View
解决视图生成重复行的问题
嘿,你这明显是踩了笛卡尔积的坑啦!你原来的代码里用逗号把authors和books直接拼在一起,但没加任何关联条件,数据库就会把每个作者和每本书都强行配对一遍,再加上主题的关联,行数不爆炸才怪呢。
问题根源
你写的FROM authors, books属于隐式内连接,但缺少authors和books之间的关联条件,导致两张表的所有行交叉匹配——比如如果有18个作者、15本书,光这俩表就会生成18×15=270行,这就是你看到的结果。
修正后的代码
首先得明确表之间的关联关系(假设books表有author_id关联authors的主键id,books的subject_id关联subjects的主键id),然后用显式连接语法加上关联条件:
CREATE VIEW book_summary(author_first_name, author_last_name, book_title, subject) AS SELECT a.first_name, a.last_name, b.title, s.subject FROM authors a JOIN books b ON a.id = b.author_id -- 核心!让每本书只匹配对应的作者 LEFT JOIN subjects s ON b.subject_id = s.id; -- 补全你原代码未写完的主题关联条件
几点说明
- 用显式
JOIN语法比隐式逗号连接更清晰,也不容易漏加关联条件。 - 给表起别名(
a代表authors,b代表books,s代表subjects)能让代码更简洁好读。 - 如果你的表关联字段不是
id/author_id/subject_id,记得替换成你实际的字段名(比如如果用作者全名关联,条件就是a.first_name = b.author_first_name AND a.last_name = b.author_last_name,但更推荐用主键id关联,避免同名作者的问题)。 - 正常关联后不会有重复行,
DISTINCT可以去掉;如果确实有重复数据,再考虑保留它。
内容的提问来源于stack exchange,提问作者Dreeww
相关产品推荐
相关产品推荐

