我正在将数据库从
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语句自我加入目标表的主键,然后将其连接到该自连接表.
原文链接:https://www.f2er.com/postgresql/192191.htmlDELETE 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.这样可以避免上面提供的子查询路由.