SQL三表JOIN查询如何去除pin、多余id等不需要的返回列
解决方案
你现在查询出现多余字段的核心原因是用了SELECT *写法,会把三张关联表的所有字段全部返回,自然会带上不需要的users.pin字段,以及重复关联产生的冗余id字段。多表关联查询不要使用SELECT *,手动明确指定需要返回的字段,就能完全控制结果集的内容。
参考修改后的SQL
你只需要在SELECT后面逐一列出你实际需要的字段,把不需要的字段排除在列表外即可,举个可灵活调整的示例:
SELECT -- 按需保留心愿单表需要的字段,重复关联用的字段如果不需要展示可以不写 "wish-list".id AS wish_list_id, "wish-list".title AS wish_list_title, "wish-list".create_at, -- 商品表字段,和心愿单id重复的holiday_id属于关联冗余字段,不需要就不查 products.id AS product_id, products.goods_name, products.price, products.sku_info, -- 用户表字段,直接排除pin字段,只保留需要的用户属性 users.id AS user_id, users.nickname, users.avatar FROM "wish-list" JOIN products ON "wish-list".id = products.holiday_id JOIN users ON "wish-list".user_id = users.id WHERE "wish-list".id = 1
几个实用提示
- 多张表如果存在同名字段(比如几乎每张表都有的id、create_time字段),建议给字段加
AS 别名区分,避免后续程序读取结果时因为字段重名报错 - 如果你用的是PostgreSQL(从表名带双引号的写法判断大概率是PG),想省点写字段的功夫,可以用
表名.* EXCEPT (不需要的字段名)的语法快速排除单表的个别字段,比如要排除users表的pin可以写users.* EXCEPT (pin),但生产环境更推荐明确列出所有需要字段的写法,后续表结构变更时不会把新增的敏感字段意外暴露到结果里 - 不要觉得手动列字段麻烦,这是写SQL的基础规范,能避免绝大多数多表查询的字段冗余、敏感字段泄露、字段重名问题。
内容的提问来源于stack exchange,提问作者Carlos Figueroa
相关产品推荐
相关产品推荐

