使用INNER JOIN删除PostgreSQL错误

d3v*_*ded 5 sql postgresql cascading-deletes sql-delete

Postgres 8.4

DELETE
FROM processing_transaction AS pt 
INNER JOIN processing_transaction_movement AS ptm 
ON pt.processing_transaction_id = ptm.processing_transaction_id
LEFT OUTER JOIN test_package tesp ON pt.test_package_id = tesp.test_package_id
LEFT OUTER JOIN test_batch tbat On tesp.test_batch_id = tbat.test_batch_id
WHERE pt.processing_transaction_type = 'TEST';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:语法错误>> INNER << LINE 1:DELETE FROM processing_transaction AS pt INNER JOIN processi ...

请问你能帮我找到我的SQL查询中的错误


感谢您的支持@desislavkamenov @jan.现在我用这个:

开始工作;

DELETE FROM processing_transaction AS pt USING processing_transaction_movement AS ptm,test_package tesp,test_batch tbat WHERE pt.processing_transaction_type ='TEST'; AND pt.processing_transaction_id = ptm.processing_transaction_id AND pt.test_package_id = tesp.test_package_id AND tesp.test_batch_id = tbat.test_batch_id

ROLLBACK;

但我需要从两个表中删除数据(processing_transaction和processing_transaction_movement),我已经找到了这样的想法,发现我可以用"ON DELETE CASCADE"来做.但我不知道如何在这里使用它.所以请再帮我一次.

Des*_*nov 14

您不能在DELETE语句中使用JOIN.而是使用USING并将第二个表放在那里.这样的事情应该有用(对不起,但是我无法测试它,所以在BEGIN交易之后运行它并检查结果,如果它们是你期望COMMIT它之前; ROLLBACK如果它们不是).

DELETE
FROM processing_transaction AS pt 
USING processing_transaction_movement AS ptm, test_package tesp, test_batch tbat 
WHERE pt.processing_transaction_type = 'TEST'
AND pt.processing_transaction_id = ptm.processing_transaction_id
AND pt.test_package_id = tesp.test_package_id
AND tesp.test_batch_id = tbat.test_batch_id
Run Code Online (Sandbox Code Playgroud)

这是文档的链接. http://www.postgresql.org/docs/current/static/sql-delete.html

  • 作为一般规则,您不应因此而复制/粘贴代码。此外,您可以将查询包装在 BEGIN 中并回滚或选择性提交:http://www.postgresql.org/docs/9.3/static/sql-begin.html (2认同)