此请求使用postgresql抛出语句超时。
DELETE FROM my_table where my_table.id IN (
SELECT DISTINCT b.id
FROM my_table a
LEFT JOIN my_table b
on b.rowA = a.rowA and b.rowB = true
WHERE a.rowB = false
)
由于某些原因,我不能在postgresql上增加我的超时。所以,我需要改进我的要求。怎么改进呢?也许不使用IN?怎么做?
感谢您的帮助。
编辑更多信息:
我在JAVA批处理中,我的错误消息如下:
引起:org.postgresql.util.PSQLException:错误:取消 由于语句超时而导致的语句 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1525) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1309) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:308) 在 org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
答案 0 :(得分:1)
我会删除不同的和左边的连接。
delete from my_table where my_table.id in (select b.id from tblA a, tblB b
where a.rowB = false and b.rowa = a.rowa and b.rowb = true);
问题的主要原因是左连接。为什么要在表a上使用左连接并将结果基于表b的ids?如果您已经使用了表a的ID,那么这是否有意义。从表a的角度来看,左连接将返回表a中的所有id,即使表b中没有匹配也是如此。这不是你想要的,因为它可能是大量的数据。您需要表a和表b的子集。因此,您不应该在不使用它的情况下询问(左连接)的所有数据。 不同也可能造成性能问题。只有在增加价值时才使用它。我在这里看不到附加价值。
答案 1 :(得分:0)
您不能在SQL上下文中使用true
和false
(即布尔文字),即使是使用PL / SQL也是如此。