【问题标题】:Adding two select statements into one insert into statement in postgresql在postgresql中将两个select语句添加到一个insert into语句中
【发布时间】:2013-12-06 14:57:53
【问题描述】:

我通过以下方式制作了一个临时表:

create temporary table return_table 
(
   p1 BIGINT, 
   p2 VARCHAR(45), 
   p3 VARCHAR(45), 
   p4 VARCHAR(45), 
   p5 VARCHAR(45), 
   p6 float, 
   p7float
) on commit drop;

我正在尝试使用 2 个选择语句并将数据插入到该临时表中。例如,我有一个名为 t1 的表,它提供前四个值,然后我希望临时表的下三个值来自另一个表。

到目前为止我有:

insert into return_table 
(Select var1, var2, var3, var4 
 from t1 where var1 = 10)

这将成功地将 4 个值放入我的临时表中,然后将其余的保留为空。很好,所以当我尝试从另一个表中插入最后三个变量时。例如

insert into return_table 
(Select var1, var2, var3, var4 
 from t1 where var1 = 10, Select var5, var6, var 7 
 from t2 where var6 = 25)

它会引发语法错误。我尝试了其他一些语法更改,但我无法找出将这些选择语句的两个结果插入同一行的正确语法。

任何帮助都会很棒!

【问题讨论】:

  • select 周围的括号根本不需要。

标签: postgresql select stored-procedures


【解决方案1】:

用逗号分隔的两个选择命令不是有效的 SQL 语法。您可以改用joinwith 语句。这是with的示例

insert into return_table 
WITH t1 AS (
    Select var1, var2, var3, var4 from t1 where var1 = 1
  ), t2 AS (
    Select var5, var6, var7 from t2 where var6 = 6
  )
select t1.var1, t1.var2, t1.var3, t1.var4, t2.var5, t2.var6, t2.var7 from t1,t2

一个人只能使用with 进行一个子查询,但我将它们都放在以展示能够根据需要添加尽可能多的表的灵活性。

请注意,列出要插入的表的所有列是一个很好的做法,

e.g. `insert into return_table (p1, p2, p3, p4, p5, p6, p7) ...`

如果你养成习惯,你会避免很多潜在的麻烦和头痛。

另外请注意,如果两个子查询中的任何一个返回的行数不同于一个,则上述示例(以及它的连接等效项)可能会产生奇怪的结果

【讨论】:

  • 是的,我的意思是说查询之间的行数是偶数。感谢您的回答!
【解决方案2】:

没有一个方便的实例来测试这个,但是如果你在你的选择语句之间加上“UNION”,那么它会是一个返回的结果集?

【讨论】:

  • 我得到错误:每个 UNION 查询必须有相同的列数
  • 联合是错误的。即使您对齐列,它也会返回 2 行而不是 1 行,第一行将有空/预定义 var1 到 4,第二行将有空 var5 到 7
  • 啊 - 明白了 - 完全误读了原来的问题 - union = 在这里失败...... :)
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2017-03-15
  • 2021-01-19
相关资源
最近更新 更多