postgresql 删除具有特定公共列的行

44u64gxh  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(99)

使用PostgreSQL时,表sessions包含id(PK)、user_idexpire列。我希望删除包含id = 'deleteme'的行,以及来自同一个人的过期会话,即其user_id与删除的行和expire < now()匹配。
我发现有效的查询是

WITH temp AS (
  DELETE FROM sessions 
  WHERE id = 'deleteme' 
  RETURNING user_id)
DELETE FROM sessions 
WHERE user_id IN (
 SELECT user_id from temp)
AND expire < now()

不起作用的是

WITH temp AS (
  DELETE FROM sessions 
  WHERE id = 'deleteme'
  RETURNING user_id)
DELETE FROM sessions
WHERE user_id = temp.user_id
AND expire < now()

其错误为“缺少表'temp'的FROM子句条目”
是否有更简单的查询可以达到与我的第一个查询相同的效果?
编辑:如果有方法可以用连接来做这个,请让我知道,因为我对SQL还很陌生,而且很想学习。我只是不知道除了连接表之外,是否还会从原始表中删除。

xtfmy6hx

xtfmy6hx1#

这里的错误信息并不十分清楚。
对于删除查询,您的CTE需要有USING子句。
因此:

WITH temp AS (
  DELETE FROM sessions 
  WHERE id = 'deleteme'
  RETURNING user_id)
DELETE FROM sessions
USING temp
WHERE user_id = temp.user_id
AND expire < now()

相关问题