Java 使来自多个表的查询更短并优化
我正在Java中使用PreparedStatement。我有一个来自多个表的sql查询。如果可能的话,我如何使这个查询变得更短和优化?DB是“Oracle 12c数据库”。另外,我的任务是使查询sql注入安全并防止注入Java 使来自多个表的查询更短并优化,java,sql,oracle,jdbc,multiple-tables,Java,Sql,Oracle,Jdbc,Multiple Tables,我正在Java中使用PreparedStatement。我有一个来自多个表的sql查询。如果可能的话,我如何使这个查询变得更短和优化?DB是“Oracle 12c数据库”。另外,我的任务是使查询sql注入安全并防止注入 preparedStatement = connection.prepareStatement("delete from " + "TBL_ORG_DATA, " + "TBL_ORG_CONTACTS, " +
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 = ?");
据我所知,在Oracle中,您必须为每个表创建单独的
delete
命令
delete from a where org_id = 101 and date_period = date '2018-05-25';
delete from b where org_id = 101 and date_period = date '2018-05-25';
如果可以修改表,则可以在删除级联上使用约束。我不知道您的表是如何组织的,但如果您可以在其中一个表中定义唯一约束,则rest可能依赖于它,如下所示:
create table a (
id number primary key, org_id number, date_period date, cola varchar2(5),
constraint uq_org_id_period unique (org_id, date_period) );
insert into a values (1, 101, date '2018-05-25', 'DEL');
insert into a values (2, 101, date '2018-05-26', 'PQR');
insert into a values (3, 102, date '2018-06-17', 'CBA');
create table b (
id number primary key, org_id number, date_period date, colb varchar2(5),
constraint fk_org_id_period
foreign key (org_id, date_period)
references a(org_id, date_period) on delete cascade);
insert into b values (1, 101, date '2018-05-26', 'AAXXX');
insert into b values (2, 102, date '2018-06-17', 'PCCQR');
insert into b values (3, 101, date '2018-05-25', 'DEL1');
insert into b values (4, 101, date '2018-05-25', 'DEL2');
insert into b values (5, 102, date '2018-06-17', 'XYZYX');
现在,如果您运行:
delete from a where (org_id, date_period) in ((101, date '2018-05-25'));
不仅表a
中的第1行将被删除,而且b
中的第3行和第4行也将被删除。您也可以使用触发器,但约束在这里更合适。这些表位于from
部分的中,现在位于where
中的join子句中。我觉得不太对。这些桌子有什么关系吗对不起,我弄错了。在这个查询中,我应该使用“删除”而不是“选择”。这些表具有相同的字段:ORG\u ID、DATE\u PERIOD。您当前的DELETE
有什么问题需要解决?@mick助记符查询非常庞大,字符串重复多次。是否存在重新生成此查询的方法?您正在从约20个表中删除数据,因此是的,SQL将很长。我个人会将这些内容分为单独的删除,但在不了解数据库模式的情况下,很难给出建议。感谢您的回复。不幸的是,在我的数据库中应用“级联删除”并非不可能。