Postgres INSERT优化:如何用单次SELECT为两个字段赋值
优化INSERT语句避免重复查询
你可以通过INSERT ... SELECT语法替代INSERT ... VALUES,把所有需要的查询整合到一个SELECT语句中,这样就能只查询一次team_member表获取id,同时完成message表的查询。
方法一:使用交叉关联查询
INSERT INTO logs (content_id, title, created_by_team_member, team_member_id) SELECT m.id, 'My Space', tm.id, tm.id FROM message m CROSS JOIN team_member tm WHERE m.id = :contentId AND tm.member_id = 1 AND tm.team_id = 5 LIMIT 1;
这里通过CROSS JOIN将message和team_member的查询结果关联,因为两个条件都只会返回单条数据,交叉关联后依然是单条结果,直接把tm.id同时赋值给两个字段即可。
方法二:使用子查询预获取team_member的id
如果担心交叉关联可能带来的潜在问题(比如某张表无匹配数据时的结果异常),可以先通过子查询把team_member的id查出来,再重复使用:
INSERT INTO logs (content_id, title, created_by_team_member, team_member_id) SELECT m.id, 'My Space', tm_sub.tm_id, tm_sub.tm_id FROM message m CROSS JOIN ( SELECT id AS tm_id FROM team_member WHERE member_id = 1 AND team_id = 5 LIMIT 1 ) tm_sub WHERE m.id = :contentId LIMIT 1;
子查询只会执行一次,得到的tm_id可以同时赋值给created_by_team_member和team_member_id两个字段,完全避免重复查询。
这两种写法都和你原来的逻辑等价,但能减少一次team_member表的查询开销,提升执行效率。
内容的提问来源于stack exchange,提问作者Filip Stojavonic
相关产品推荐
相关产品推荐

