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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/postgresql/192191.html

猜你在找的Postgre SQL相关文章