【发布时间】:2018-08-01 07:23:57
【问题描述】:
我在 Java 中使用 PreparedStatement。我有来自多个表的 sql 查询。如果可能的话,我怎样才能使这个查询更短和优化? DB 是“Oracle 12c 数据库”。另外我的任务是使查询 sql-injection 安全并防止注入。
preparedStatement = connection.prepareStatement("delete from " +
"TBL_ORG_DATA, " +
"TBL_ORG_CONTACTS, " +
"TBL_HEALTH_SERVICE, " +
"TBL_EDUCATION, " +
"TBL_LENGTH_WORK, " +
"TBL_CONTRACTS, " +
"TBL_EVENTS, " +
"TBL_TRADE_UNIONS, " +
"TBL_COMMITTEES, " +
"TBL_HEALTH_CHECK, " +
"TBL_ACCIDENTS, " +
"TBL_VICTIMS, " +
"TBL_ACCIDENTS_DAMAGE, " +
"TBL_ATTESTATION, " +
"TBL_ATTESTATION_FIVE_YEAR, " +
"TBL_TRANING, " +
"TBL_TRAINING_MANAGER, " +
"TBL_TRANING_THREE_YEAR, " +
"TBL_MANAGEMENT " +
"where TBL_ORG_DATA.ORG_ID = ? AND\n" +
"TBL_ORG_CONTACTS.ORG_ID = ? AND\n" +
"TBL_HEALTH_SERVICE.ORG_ID = ? AND\n" +
"TBL_EDUCATION.ORG_ID = ? AND\n" +
"TBL_LENGTH_WORK.ORG_ID = ? AND\n" +
"TBL_CONTRACTS.ORG_ID = ? AND\n" +
"TBL_EVENTS.ORG_ID = ? AND\n" +
"TBL_TRADE_UNIONS.ORG_ID = ? AND\n" +
"TBL_COMMITTEES.ORG_ID = ? AND\n" +
"TBL_HEALTH_CHECK.ORG_ID = ? AND\n" +
"TBL_ACCIDENTS.ORG_ID = ? AND\n" +
"TBL_VICTIMS.ORG_ID = ? AND\n" +
"TBL_ACCIDENTS_DAMAGE.ORG_ID = ? AND\n" +
"TBL_ATTESTATION.ORG_ID = ? AND\n" +
"TBL_ATTESTATION_FIVE_YEAR.ORG_ID = ? AND\n" +
"TBL_TRANING.ORG_ID = ? AND\n" +
"TBL_TRAINING_MANAGER.ORG_ID = ? AND\n" +
"TBL_TRANING_THREE_YEAR.ORG_ID = ? AND\n" +
"TBL_MANAGEMENT.ORG_ID = ? AND\n" +
"TBL_ORG_DATA.DATE_PERIOD = ? AND\n" +
"TBL_ORG_CONTACTS.DATE_PERIOD = ? AND\n" +
"TBL_HEALTH_SERVICE.DATE_PERIOD= ? AND\n" +
"TBL_EDUCATION.DATE_PERIOD= ? AND\n" +
"TBL_LENGTH_WORK.DATE_PERIOD = ? AND\n" +
"TBL_CONTRACTS.DATE_PERIOD = ? AND\n" +
"TBL_EVENTS.DATE_PERIOD = ? AND\n" +
"TBL_TRADE_UNIONS.DATE_PERIOD = ? AND\n" +
"TBL_COMMITTEES.DATE_PERIOD = ? AND\n" +
"TBL_HEALTH_CHECK.DATE_PERIOD = ? AND\n" +
"TBL_ACCIDENTS.DATE_PERIOD = ? AND\n" +
"TBL_VICTIMS.DATE_PERIOD = ? AND\n" +
"TBL_ACCIDENTS_DAMAGE.DATE_PERIOD = ? AND\n" +
"TBL_ATTESTATION.DATE_PERIOD = ? AND\n" +
"TBL_ATTESTATION_FIVE_YEAR.DATE_PERIOD = ? AND\n" +
"TBL_TRANING.DATE_PERIOD = ? AND\n" +
"TBL_TRAINING_MANAGER.DATE_PERIOD = ? AND\n" +
"TBL_TRANING_THREE_YEAR.DATE_PERIOD = ? AND\n" +
"TBL_MANAGEMENT.DATE_PERIOD = ?");
【问题讨论】:
-
from部分中有许多表,现在在where中加入子句。对我来说似乎不合适。这些表是否以某种方式相互关联 -
对不起,我弄错了。在这个查询中,我应该使用“删除”而不是“选择”。这些表具有相同的字段:ORG_ID、DATE_PERIOD。
-
您当前的
DELETE有什么问题需要解决? -
@MickMnemonic 查询很大,字符串会重复很多次。是否存在重新制作此查询的方法?
-
您正在从大约 20 个表中删除数据,所以是的,SQL 会很长。我个人会将这些拆分为单独的 DELETE,但在不了解您的数据库架构的情况下,很难给出建议。
标签: java sql oracle jdbc multiple-tables