语法错误:应为“(”或“,”或关键字 SELECT,但在 [6:1] 处获得关键字 DELETE

Posted

技术标签:

【中文标题】语法错误:应为“(”或“,”或关键字 SELECT,但在 [6:1] 处获得关键字 DELETE【英文标题】:Syntax error: Expected "(" or "," or keyword SELECT but got keyword DELETE at [6:1] 【发布时间】:2021-12-29 09:54:45 【问题描述】:
--DELETE DUPLICATE VALUE IF HAVE TO
WITH cte AS
(
  SELECT *, ROW_NUMBER() OVER (PARTITION BY ride_id ORDER BY started_at) AS row_num
  FROM `case-study-1-bike-share.bike_share.202102`
)
DELETE FROM cte
WHERE row_num > 1;

我想删除重复值,但收到以下错误。我该如何解决这个问题?

【问题讨论】:

您的 SQL 实现不允许从 CTE 中删除。你可以改用EXISTS() 但我想从表中删除行而不检查它 所以你想删除所有除了第一个(每个ride_id?) 你可以这样做:从case-study-1-bike-share.bike_share.202102 删除其中ride_id in ( WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BYride_id ORDER BY started_at) AS row_num FROM case-study-1-bike-share.bike_share.202102 ) 选择ride_id 来自 cte WHERE row_num > 1 ) 是的,删除重复行,除了ride_id 列的第一个唯一值 【参考方案1】:

并非所有 SQL 实现都允许可修改的 CTE。但你不需要它们(在这种情况下)。

您可以使用 EXISTS(...) 检查相同的 ride_id) 是否存在较早的观察结果。如果this 存在较旧的,则this 不能是最旧的,可以删除。


-- DELETE DUPLICATE VALUE IF HAVE TO
DELETE FROM "case-study-1-bike-share.bike_share.202102" d
WHERE EXISTS (
        SELECT *
        FROM "case-study-1-bike-share.bike_share.202102" x      -- same table
        WHERE x.ride_id = d.ride_id                             -- same ride
        AND x.started_at < d.started_at                         -- but older date exists
        )
        ;

【讨论】:

以上是关于语法错误:应为“(”或“,”或关键字 SELECT,但在 [6:1] 处获得关键字 DELETE的主要内容,如果未能解决你的问题,请参考以下文章

pg:select * from analyse 语法错误 在 "analyse" 或附近的 LINE 1: select * from analyse

获取 Rails 错误“语法错误,意外 tSYMBEG,需要关键字_do 或 '' 或 '('”

SQLSTATE [42000]:语法错误或访问冲突:sql select 语句中的 1064

错误:在 '.' 之前应为 `,' 或 `...'令牌

获取 PSQLException:错误:在带有 Postgres 的 spark jdbc 中使用查询而不是表名时在“SELECT”处或附近出现语法错误

从服务器检索数据到本地返回 SQLSTATE[42000]:语法错误或访问冲突:1142 SELECT 命令拒绝用户