I have a main.comments table where I store users comments.
I'm trying to add a comment to the database and get some data as a return.
Here's my query
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
So I was expecting to add a comment and get the data I wanted but that wasn't the case, instead I got this error
ERROR: more than one row returned by a subquery used as an expression SQL state: 21000
I thought I had a problem with the subquery so I used it individually and got only one row in return.
So I used LIMIT 1 within the subquery and I got the result I was expecting but that doesn't make sense in my query. Can someone please explain this behavior?
And also my main.users table doesn't contain any user_id duplicate since I'm using the SERIAL type.
Real Culprit is this line in your code
(SELECT username FROM main.users WHERE main.users.user_id = user_id)
Try it like This:
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
DEMO:
I have removed the schema name for clarity
The problem is that the user_id in your subquery is not referring to the newly inserted row in main.comments, but to main.users, so the condition becomes TRUE and all rows from users are returned.
I'd use a CTE it like this:
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With