【问题标题】:DELETE rows with specific common column删除具有特定公共列的行
【发布时间】:2023-01-16 18:29:23
【问题描述】:

使用 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 很陌生并且渴望学习。我只是不知道除了连接表之外,这是否会从原始表中删除。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这里的错误信息不是很清楚。

    对于删除查询,您的 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()
    

    【讨论】:

    • 它说我应该做WHERE sessions.user_id = temp.user_id或重命名user_id以避免歧义。所以除此之外,这有效!你能澄清一下什么时候需要USING吗?查找 EQUIJOINNATURAL JOIN 弹出,这两个我都是第一次听到。
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2020-07-08
    • 2016-10-04
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多