PostgreSQL:用作表达式的子查询返回多行

PostgreSQL:用作表达式的子查询返回多行,sql,postgresql,sql-insert,postgresql-12,Sql,Postgresql,Sql Insert,Postgresql 12,我有一个main.comments表,用于存储用户的评论。 我正在尝试向数据库添加注释,并获取一些数据作为返回。 这是我的问题 INSERT INTO main.comments (text, post_id, user_id) VALUES('sample', 11, 1) RETURNING comment_id, text, post_id, (SELECT username FROM main.users WHERE main.users.user_id = user_id) AS u

我有一个
main.comments
表,用于存储用户的评论。 我正在尝试向数据库添加注释,并获取一些数据作为返回。 这是我的问题

INSERT INTO main.comments (text, post_id, user_id)
VALUES('sample', 11, 1)
RETURNING 
comment_id,
text,
post_id,
(SELECT username FROM main.users WHERE main.users.user_id = user_id) AS username,
created_at,
updated_at
所以我希望添加一条注释并获得我想要的数据,但事实并非如此,而是我得到了这个错误

错误:用作表达式的子查询返回多行 SQL状态:21000

我认为子查询有问题,所以我单独使用它,只得到一行作为返回。 因此,我在子查询中使用了
limit1
,得到了我期望的结果,但这在我的查询中没有意义。有人能解释一下这种行为吗? 而且我的
main.users
表不包含任何
user\u id
副本,因为我使用的是
SERIAL
类型

  • PostgreSQL 12.4

真正的罪魁祸首是代码中的这一行

(SELECT username FROM main.users WHERE main.users.user_id = user_id)
试着这样做:

INSERT INTO comments (text, post_id, user_id)
VALUES('sample', 11, 1)
RETURNING 
comment_id,
text,
post_id,
(SELECT username FROM users t1 WHERE t1.user_id = comments.user_id) AS username,
created_at,
updated_at


问题是子查询中的
user\u id
不是指
main.comments
中新插入的行,而是指
main.users
,因此条件变为
TRUE
,并返回
users
中的所有行

我会用CTE,它是这样的:

WITH ins AS (
   INSERT INTO main.comments (text, post_id, user_id)
   VALUES('sample', 11, 1)
   RETURNING 
      comment_id,
      text,
      post_id,
      user_id,
      created_at,
      updated_at
)
SELECT ins.comment_id,
       ins.text,
       ins.post_id,
       u.username,
       ins.created_at,
       ins.updated_at
FROM ins
   JOIN main.users AS u ON ins.user_id = u.user_id;

您可以首先输入空白值

       INSERT INTO main.comments (text, post_id, user_id)
    VALUES('sample', 11, 1)
    RETURNING 
    comment_id,
    text,
    post_id,
    NULL AS username,
    created_at,
updated_at;
然后更新您的表

UPDATE main.comment 
SET username = (SELECT username )
FROM main.users 
WHERE main.users.user_id = main.comment.user_id;

没有测试,但应该工作

子查询中的
WHERE
条件将为
TRUE
对于
user\u id不为NULL的所有行
@LaurenzAlbe感谢您的响应,是否有任何解决方案,或者我应该坚持使用类似于限制的解决方案?@A限制解决方案将不起作用。它将给出错误的名称。
UPDATE main.comment 
SET username = (SELECT username )
FROM main.users 
WHERE main.users.user_id = main.comment.user_id;