PostgreSQL中如何将两次不同查询结果按顺序插入同一张临时表?
哦,我明白你的问题了!你遇到的错误是因为SELECT INTO在PostgreSQL里是用来新建表的,当你第一次用CREATE TEMP TABLE AS创建了mytable之后,第二次再用SELECT INTO mytable就会因为表已经存在而报错。
要实现你想要的「先插入第一次查询的结果(按date降序),再插入第二次查询的结果(按date升序)」的需求,有两种简单的方法:
方法一:分两步创建+插入
这是最直接的方式,先创建临时表并插入第一部分数据,再用INSERT INTO追加第二部分:
- 第一步:创建临时表并插入
bc=true的结果(按date降序)
CREATE TEMP TABLE mytable AS SELECT * FROM test WHERE bc = true ORDER BY date DESC;
- 第二步:向已存在的临时表插入
bc=false的结果(按date升序)
INSERT INTO mytable SELECT * FROM test WHERE bc = false ORDER BY date ASC;
- 验证结果
SELECT * FROM mytable;
这样操作后,临时表的顺序就会是你期望的:先one,-600、two,-500,再three,1200、four,1300,因为INSERT INTO会严格按照你查询返回的顺序把数据追加到表的末尾。
方法二:用UNION ALL一次性创建表
如果你想一步到位,可以给两个查询结果加上「排序优先级标记」,然后整体排序:
CREATE TEMP TABLE mytable AS -- 第一部分:bc=true的结果,标记优先级为1,按date降序 SELECT *, 1 AS sort_priority FROM test WHERE bc = true UNION ALL -- 第二部分:bc=false的结果,标记优先级为2,按date升序 SELECT *, 2 AS sort_priority FROM test WHERE bc = false -- 先按优先级排序(确保第一部分在前),再按各自的date规则排序 ORDER BY sort_priority, CASE WHEN sort_priority = 1 THEN date END DESC, CASE WHEN sort_priority = 2 THEN date END ASC;
如果不需要sort_priority列,你可以之后删掉它:
ALTER TABLE mytable DROP COLUMN sort_priority;
这种方法的好处是只需要执行一次创建语句,适合更复杂的合并场景。
核心问题就是你误用了SELECT INTO——它是用来新建表的,追加数据应该用INSERT INTO ... SELECT ...。
内容的提问来源于stack exchange,提问作者codebot
相关产品推荐
相关产品推荐

