当前位置: 首页 > 面试题库 >

删除了PostgreSQL的文件``不存在''。

单于善
2023-03-14
问题内容

我正在使用postgreSQL9.1,并且想使用此提示从表中删除重复项:
另一种可能的方式是

; 

--Ensure that any immediately preceding statement is terminated with a semicolon above
WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3 
                                       ORDER BY ( SELECT 0)) RN
         FROM   #MyTable)
DELETE FROM cte
WHERE  RN > 1;

我在ORDER BY (SELECT 0)上面使用,因为在打平的情况下保留哪一行是任意的。

为了保留最新的RowID顺序,例如,您可以使用ORDER BY RowID DESC

执行计划

执行计划通常比接受的答案更简单,更有效,因为它不需要自我连接。

执行计划

但是,情况并非总是如此。一种GROUP BY可能是首选解决方案的地方是优先选择散列聚合而不是流聚合的情况。

该ROW_NUMBER解决方案将始终提供几乎相同的计划,而该GROUP BY策略则更为灵活。

执行计划

可能支持散列聚合方法的因素是

分区列上没有有用的索引
相对较少的组,每组中重复项相对较多
在第二种情况的极端版本​​中(如果每个组中很少有很多重复的组),还可以考虑简单地将行插入以保存到新表中,然后TRUNCATE对原始行进行-ing并将其复制回去,以最大程度地减少日志记录,相比之下删除一个行的比例很高。

因此,我的查询如下所示:

WITH cte
 AS (SELECT ROW_NUMBER() 
 OVER (PARTITION BY code, card_id, parent_id 
     ORDER BY id DESC) RN
     FROM card)
DELETE FROM cte
WHERE RN > 1

但它告诉我

ERROR: relation "cte" does not exist
SQL state: 42P01
Character: 157

但是,此语句可以正常工作:

WITH cte
 AS (SELECT ROW_NUMBER() 
 OVER (PARTITION BY code, card_id, parent_id 
     ORDER BY id DESC) RN
     FROM merchantcard)
SELECT * FROM cte
WHERE RN > 1

任何想法如何使它起作用?谢谢!


问题答案:

这是因为PostgreSQL中的CTE与SQL Server中的CTE工作方式不同。在SQLServer中,CTE就像一个可更新的视图,因此您可以从中删除或更新它们,而在PostgreSQL中则不能。

您可以加入cte和删除,例如:

with cte as (
    select
        id,
        row_number() over(partition by code, card_id, parent_id order by id desc) as rn
    from card
)
delete
from card
where id in (select id from cte where rn > 1)

另一方面,您可以在PostgreSQL的CTE中编写DDL语句(请参阅文档),这可能非常方便。例如,您可以从中删除所有行card,然后仅插入具有row_number = 1的行:

with cte1 as (
    delete
    from card
    returning *
), cte2 as (
    select
        row_number() over(partition by code, card_id, parent_id order by id desc) as rn,
        *
    from cte1
)
insert into card
select <columns here>
from cte2
where rn = 1


 类似资料:
  • 我想创建一个文件;如果它已经存在,我想删除它并重新创建它。我尝试这样做,但它抛出一个Win32错误。我做错了什么?

  • 问题内容: 尝试删除不为空的文件夹时,出现“访问被拒绝”错误。我尝试使用以下命令:。 删除/删除不为空的文件夹/目录的最有效方法是什么? 问题答案: 标准库参考:shutil.rmtree。 根据设计,在包含只读文件的文件夹树上失败。如果要删除该文件夹而不管它是否包含只读文件,请使用

  • 问题内容: 我有一张桌子。为了快速升级/部署网站,我做了一个新表,其中包含一些新数据,方法是: 现在每个表都有一个PK列,看起来像: 重要的一点是,两个表都依赖于完全相同的序列。没有。就我的目的而言,这似乎还可以。 此后,我加载了新数据并重命名了表,以便将其作为实盘接管,而原始表变成了。现在我尝试删除: 足够公平,列默认值仍取决于顺序。 这是踢脚线。 因此,不再对序列具有任何可见的依赖关系,但是它

  • 我想镜像两个文件夹,但排除某些文件类型(例如js文件)。我可以用 /XF选项来做到这一点。 我遇到的问题是,如果目标文件夹中有一个带有js文件的Foo文件夹,但源文件夹中没有Foo文件夹,那么下面的robocopy命令将删除目标端的Foo文件夹以及其中的js文件。 机器人复制。exe d:\Source d:\Destination/E/PURGE/XF*。js/COPYALL/FFT 我想要的是

  • 当我遇到与找不到文件相关的错误时,我正在执行此代码。文件存在于代码所在的同一文件夹中,但此错误不会继续。请帮忙! 代码: 以下是错误: Traceback(最近的调用最后): 文件“F:\Report on Artificial Intelligence\candlestick code\c5.py”,第13行,df=pd.read\u csv('nse2.csv',parse\u dates=T

  • 我有文件在上传/project ect1/更新。 问题是,只删除更新中的文件。我想删除文件夹上载中的目录。。。也就是说,文件夹名“project1”和“update”在更新中的文件被删除后也会被删除。你能帮我找出错误吗?? 这个编码发出警告 警告:clocdirer()期望参数1为资源, 警告:rmdir(update)[function.rmdir]:没有这样的文件或目录。。 但是在目录上传中,