【问题标题】:How to do an insert select with the select subquery returning multiple columns如何使用返回多列的选择子查询进行插入选择
【发布时间】:2023-03-12 21:55:01
【问题描述】:

我想在表中插入一些值,然后剩余的值应该来自 Postgres 中的一个 select 子查询,我被卡住了,我还需要在其他地方重用代码 请帮帮我。 我遇到了subquery must return only one column 的错误。我要返回email、name、address三列

INSERT INTO
    books
      VALUES 
      ( 1, 2, 3, (SELECT email, name, address FROM users WHERE userID=1)) RETURNING *;

【问题讨论】:

  • 您有多个用户 ID = 1 的用户,也许您需要清理数据库。
  • 我不这么认为。 user_id 是主键
  • 你为什么不检查?编写该查询的另一种方式是INSERT INTO books SELECT 1, 2, 3, email, name, address FROM users WHERE userID = 1,这可能值得一试
  • 但是值 1、2、3 不在用户表中,会这样工作吗?
  • 在我看来,来自 PostgreSql 的错误消息在这里有点误导。

标签: sql postgresql


【解决方案1】:

如果您的 INSERT 源是 SELECT,则不要使用 VALUES 子句:

INSERT INTO books
SELECT 1,2,3,email, name, address 
FROM users 
WHERE userID=1
RETURNING *;

请注意,明确列出目标表的列是一种很好的编码风格:insert into books (col1, col2, col3, ...)

【讨论】:

  • @Joakims 的答案已经回答了,但我真的很感激,因为这是同一个答案
  • 如果满足条件,我还尝试从表中选择所有内容,然后在满足相同条件时将其与另一个表连接。我该怎么做,我想要某种 LEFT JOIN。谢谢
  • @OkabaMac 。 . .新问题应该以 questions 的形式提出,而不是在 cmets 中。
【解决方案2】:
SELECT `email` as f FROM users WHERE userID=1
union SELECT `name` as f FROM users WHERE userID=1
union SELECT `address` as f FROM users WHERE userID=1

【讨论】:

  • 在这里使用 UNION 完全没有意义,并且会返回多行,而这正是 不是 OP 想要的
  • 标识符周围的反引号在(标准)SQL 中无效
猜你喜欢
  • 2015-07-18
  • 2019-07-05
  • 2021-07-23
  • 1970-01-01
  • 2015-03-07
  • 2016-01-28
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多