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

在 Oracle 数据库上使用左连接删除

如何解决在 Oracle 数据库上使用左连接删除

我有以下适用于 MSsqlsql 语句:

DELETE VERTICALCALculaTIONRULE FROM VERTICALCALculaTIONRULE
        LEFT JOIN ATTRIBUTE ON ATTRIBUTE.ID = VERTICALCALculaTIONRULE.ATTRIBUTEID 
        WHERE NOT EXISTS (SELECT * FROM ORGANISATIONUNIT  WHERE ORGANISATIONUNIT.ID = ATTRIBUTE.ORGANISATIONUNITID);

我将它用于 postgres 数据库

delete from verticalcalculationrule
        using attribute
        where attribute.id = verticalcalculationrule.attributeid and not exists (select * from organisationunit where organisationunit.id = attribute.organisationunitid)

如何在 Oracle 数据库上执行此删除操作。当我使用此 sql 语句时,DBeaver 向我显示错误

在 oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)

at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)

at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)

at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)

at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)

at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)

at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:213)

at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:37)

at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:896)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119)

at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1737)

at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1692)

at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:300)

at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:327)

at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:130)

... 12 more

引起:错误:933,位置:31,sql = DELETE VERTICALCALculaTIONRULE from VERTICALCALculaTIONRULE

        LEFT JOIN ATTRIBUTE ON ATTRIBUTE.ID = VERTICALCALculaTIONRULE.ATTRIBUTEID 

        WHERE NOT EXISTS (SELECT * FROM ORGANISATIONUNIT  WHERE ORGANISATIONUNIT.ID = ATTRIBUTE.ORGANISATIONUNITID),Originalsql = DELETE VERTICALCALculaTIONRULE FROM VERTICALCALculaTIONRULE

        LEFT JOIN ATTRIBUTE ON ATTRIBUTE.ID = VERTICALCALculaTIONRULE.ATTRIBUTEID 

        WHERE NOT EXISTS (SELECT * FROM ORGANISATIONUNIT  WHERE ORGANISATIONUNIT.ID = ATTRIBUTE.ORGANISATIONUNITID),Error Msg = ORA-00933: sql-Befe

解决方法

如果我正确地遵循了逻辑,这应该是等效的:

DELETE VERTICALCALCULATIONRULE vcr 
    WHERE NOT EXISTS (SELECT 1
                      FROM ATTRIBUTE a JOIN
                           ORGANISATIONUNIT ou
                           ON ou.ID = a.ORGANISATIONUNITID
                      WHERE a.ID = vcr.ATTRIBUTEID 
                     );

这会删除没有与规则的任何属性关联的组织的规则。我建议您在永久更改表格之前进行测试。

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