我正在将数据库从
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”或附近发回语法错误.
正如其他人所说,你不能直接在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 举报,一经查实,本站将立刻删除。