微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 使用Postgres中的左外连接删除

我正在将数据库MySQL切换到Postgres sql.在MysqL中工作的选择查询在Postgres中工作,但类似的删除查询不会.

我有两个数据表列出了某些备份文件所在的位置.现有数据(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;

我尝试过DELETE ed和DELETE ed.*这两个都在“ed”或附近呈现语法错误.类似的错误,如果我尝试没有ed的别名.如果我尝试

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

Postgres在“LEFT”或附近发回语法错误.

我被stumped,找不到很多关于删除查询使用特定于psql的连接.

正如其他人所说,你不能直接在DELETE语句中LEFT 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;

注意在WHERE子句中的tv_episodes.id上的self join.这样可以避免上面提供的子查询路由.

原文地址:https://www.jb51.cc/postgresql/192191.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐