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;