当前位置: 首页 > 知识库问答 >
问题:

在Postgres中使用左外连接删除

莫乐
2023-03-14

我正在将数据库从MySQL切换到Postgres SQL。在MySQL中有效的select查询在Postgres中也有效,但类似的delete查询却不能。

我有两个数据表,列出了某些备份文件的位置。现有数据(ed)和新数据(nd)。此语法将挑选出可能说明文件在现有数据表中的位置的现有数据,根据相等的文件名和路径对其进行匹配,但没有关于文件在新数据中的位置的信息:

SELECT ed.id, ed.file_name, ed.cd_name, ed.path, nd.cd_name
FROM tv_episodes AS ed
LEFT OUTER JOIN data AS nd ON
ed.file_name = nd.file_name AND 
ed.path = nd.path
WHERE ed.cd_name = 'MediaLibraryDrive' AND nd.cd_name IS NULL;

我希望使用以下语法运行删除查询:

DELETE ed
FROM tv_episodes AS ed
LEFT OUTER JOIN data AS nd ON
ed.file_name = nd.file_name AND 
ed.path = nd.path
WHERE ed.cd_name = 'MediaLibraryDrive' AND nd.cd_name IS NULL;

我试过< code>DELETE ed和< code>DELETE ed。*这两种情况都会在“ed”处或附近呈现< code >语法错误。如果我在没有别名< code>ed的情况下尝试,也会出现类似的错误。如果我尝试

DELETE FROM tv_episodes AS ed
LEFT  JOIN data AS nd.....

Postgres在“LEFT”处或附近发送回语法错误。

我被难住了,在使用特定于psql的连接的删除查询上找不到太多东西。


共有3个答案

薛征
2023-03-14

使用DELETE… USING语法:

DELETE FROM tv_episodes USING data WHERE 
tv_episodes.file_name = data.file_name AND 
tv_episodes.path = data.path AND 
tv_episodes.cd_name = 'MediaLibraryDrive' AND 
data.cd_name IS NULL;
李鹏
2023-03-14

正如 bf2020 指出的那样,postgres 在执行 DELETE 查询时不支持 JOIN。子查询的建议解决方案让我想到了解决方案。从上面优化 SELECT 查询,并将其用作 DELETE 查询语句的子查询:

DELETE FROM tv_episodes 
WHERE id in (
    SELECT ed.id
    FROM tv_episodes AS ed
    LEFT OUTER JOIN data AS nd ON
    ed.file_name = nd.file_name AND 
    ed.path = nd.path
    WHERE ed.cd_name = 'MediaLibraryDrive' AND nd.cd_name IS NULL
);

对于一些数据库系统,特别是MySQL,子查询通常是低效的,会消耗时间和CPU资源。根据我的经验,我尽量避免使用子查询,因为这样效率很低,而且这种查询有时是磨练技能的简单方法,比如学习连接语法。

由于postgre不允许使用连接删除查询,因此上述解决方案是有效的。

孔弘盛
2023-03-14

正如其他人所指出的,您不能直接在DELETE语句中离开JOIN。但是,您可以使用USING语句对目标表的主键进行自连接,然后对自连接表进行左连接。

DELETE FROM tv_episodes
USING tv_episodes AS ed
LEFT OUTER JOIN data AS nd ON
   ed.file_name = nd.file_name AND 
   ed.path = nd.path
WHERE
   tv_episodes.id = ed.id AND
   ed.cd_name = 'MediaLibraryDrive' AND nd.cd_name IS NULL;

注意tv_epinodes上的自连接。WHERE子句中的id。这避免了上面提供的子查询路由。

 类似资料:
  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F

  • 为什么我不能在SELECT部分执行NULL测试?有办法解决这个问题吗?

  • MariaDB 用于返回条件中指定的左侧表中的所有行,并仅返回满足连接条件的其他表中的行。 也被称为。 语法: 图形表示如下: 注: 上图中,两个图形的左侧表(table1)和右侧表(table2)中间交叉蓝色部分,以及左侧表(table1)就是连接返回的结果集。 为了方便演示,我们需要创建两个表,并插入一些数据 - 插入数据 - 当前表中的行记录如下 - 当前表中的行记录如下 - 示例1 使用以

  • 问题内容: 我有一个Hibernate的服务方法,例如:。securityId2由用户传递。每个SecurityContact与一个Contact有多对一的关系,因此Hibernate在运行此查询时会自动调用联接。但是,Hibernate始终运行的联接是内部联接,因此无法正常运行。有没有办法强迫Hibernate在内部生成左外部联接?这是SecurityContact类的代码: 问题答案: 尝试多

  • 我正在尝试使用Criteria API获取以下查询: 我做到了: 尝试添加 实体看起来像 和 尝试以不同的方式使用联接,但看起来我缺少了一些东西。我得到了orderBy,谓词都是正确的。我正在使用JPA 2.1和Oracle。

  • 问题内容: 下载由下载时间,下载时间ID和Buno ID组成。故障由故障代码,下载时间ID,状态和类型组成。下载可能有很多错误,并且可以加入下载时ID。 给定一组故障代码,结果必须包含每个故障代码以及相应的故障计数。如果在下载中未找到故障代码,则必须返回故障计数为零的故障代码。 这个问题似乎需要一个OUTER JOIN,但是在Postgres上却没有像预期的那样工作,因为它似乎没有从LEFT表中返