【问题标题】:Why does the cte return the error that it does not exist?为什么cte返回不存在的错误?
【发布时间】:2021-06-14 21:18:58
【问题描述】:

这是我的代码

WITH CTE AS(
    SELECT COUNT(CASE name WHEN 'John' THEN 1 END) OVER (PARTITION BY BlockID ORDER BY Step) AS Johns
    FROM dbo.YourTable)
DELETE FROM CTE
WHERE Johns >= 1;
SELECT *
FROM dbo.YourTable;

当我在笔记本中运行代码时,它返回以下错误

ERROR: syntax error at or near "DELETE"

但我似乎在查询中找不到任何错误

当我尝试在在线编译器中执行此操作时,它返回 relation "cte" does not exist 的错误 也许这个错误可能是相关的?...

这就是我想用 cte 做的事情: 我的第一张桌子:

Block_id step name 
1         1    Marie 
1         2    Bob
1         3    John
1         4    Lola
2         1    Alex
2         2    John
2         3    Kate
2         4    Herald
3         1    Alec
3         2    Paul
3         3    Rex

如您所见,数据框按 block_id 排序,然后按步排序。我只想在一个 block_id 中删除我命名为 John 的行之后的所有内容(还有 John 的行)。所以想要的输出是

Block_id step name 
1         1    Marie 
1         2    Bob
2         1    Alex
3         1    Alec
3         2    Paul
3         3    Rex

【问题讨论】:

  • 尝试在创建 CTE 之前添加分号 stackoverflow.com/questions/6938060/…
  • 您标记了 Postgres,但 dbo 是典型的 SQL Server 架构名称。您确定 Postgres 是您使用的 DBMS?
  • Postgresql 不支持可更新的 CTE。
  • @stickybit 是的,我确定
  • @forpas 你知道如何重写代码吗?

标签: sql postgresql common-table-expression sql-delete


【解决方案1】:

创建一个 CTE,它为每个 Block_id 返回第一个 Johnstep
然后将表加入 CTE:

WITH cte AS (
  SELECT Block_id, MIN(step) step
  FROM tablename
  WHERE name = 'John'
  GROUP BY Block_id
)
DELETE FROM tablename t
USING cte c
WHERE c.Block_id = t.Block_id AND c.step <= t.step

请参阅demo

【讨论】:

  • 非常感谢!它仍然在我的笔记本中返回错误,但至少在编译器中有效)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
相关资源
最近更新 更多