从多个表中删除记录时获取 "java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword"
Getting "java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword" on deleting Record from multiple tables
我正在尝试使用 java 删除针对 attendnt_N
的行,但收到此异常 java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword
。如果有人知道它的 removal/solution 请告诉我。这是我的代码:
ResultSet rss = stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");
System.out.println(attendnt_N); //working fine
int countd = 0;
while(rss.next()){
countd++;
if(attendnt_N.equalsIgnoreCase(rss.getString(1))){
String dell = ("(DELETE FROM ATTENDANCE, ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
//String del = ("(DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "')");
//String dell = ("(DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
//stmt.executeQuery(del);
stmt.executeQuery(dell);
JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" is Deleted");
System.out.println("Deleted");
}
}
if(countd == 0){
JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" does not exist");
System.out.println("Not Deleted");
faceFrame.repaint();
delBut.setEnabled(true);
}
Oracle一次只支持删除一个table,相信HQL也有这个限制。所以你应该使用两个单独的 DELETE
语句:
String del1 = ("DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "'";
String del2 = ("DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "'";
stmt.executeUpdate(dell);
stmt.executeUpdate(del2);
执行记录删除的正确方法已在用户 Tim Biegeleisen 的回答中提供。虽然,这个问题并没有说明你的 table 结构是什么,但你会 运行 进入一个潜在的性能故障:
米
您正在使用的 SELECT
查询将导致 CROSS JOIN。因此,应更改下面的 SELECT
语句以使用更具限制性的连接,例如 INNER JOIN。
stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");
应该替换成类似
的东西
stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS WHERE ATTENDENCE.ATTENDANT_NAME = ATTENDANTS.ATTENDANT_NAME AND ATTENDANTS.ATTENDANT_NAME = 'attendant1'").
但我认为这是不必要的。使用 Tim 的技术,您可以有效地删除所需的记录,而不会造成太多复杂性和性能影响。
首先,当您 post 时,您应该禁止注释 sql 查询,这会使代码更难阅读。
Tim Biegeleisen 是对的。您应该只执行一个 delete by table,但您还需要更改语句中使用的方法。
stmt.executeQuery(dell)
用于选择查询。
对于更新,请使用 stmt.executeUpdate(dell)
查看文档:
ResultSet executeQuery(String sql)
Executes the given SQL statement, which returns a single ResultSet
object.
int executeUpdate(String sql)
Executes the given SQL statement, which may be an INSERT, UPDATE, or
DELETE statement or an SQL statement that returns nothing, such as an
SQL DDL statement.
我正在尝试使用 java 删除针对 attendnt_N
的行,但收到此异常 java.sql.SQLSyntaxErrorException: ORA-00928: missing SELECT keyword
。如果有人知道它的 removal/solution 请告诉我。这是我的代码:
ResultSet rss = stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");
System.out.println(attendnt_N); //working fine
int countd = 0;
while(rss.next()){
countd++;
if(attendnt_N.equalsIgnoreCase(rss.getString(1))){
String dell = ("(DELETE FROM ATTENDANCE, ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
//String del = ("(DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "')");
//String dell = ("(DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "')");
//stmt.executeQuery(del);
stmt.executeQuery(dell);
JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" is Deleted");
System.out.println("Deleted");
}
}
if(countd == 0){
JOptionPane.showMessageDialog(null, "Record against "+ attendnt_N +" does not exist");
System.out.println("Not Deleted");
faceFrame.repaint();
delBut.setEnabled(true);
}
Oracle一次只支持删除一个table,相信HQL也有这个限制。所以你应该使用两个单独的 DELETE
语句:
String del1 = ("DELETE FROM ATTENDANCE WHERE Attendant_Name ='" + attendnt_N + "'";
String del2 = ("DELETE FROM ATTENDANTS WHERE Attendant_Name ='" + attendnt_N + "'";
stmt.executeUpdate(dell);
stmt.executeUpdate(del2);
执行记录删除的正确方法已在用户 Tim Biegeleisen 的回答中提供。虽然,这个问题并没有说明你的 table 结构是什么,但你会 运行 进入一个潜在的性能故障:
米
您正在使用的 SELECT
查询将导致 CROSS JOIN。因此,应更改下面的 SELECT
语句以使用更具限制性的连接,例如 INNER JOIN。
stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS");
应该替换成类似
的东西stmt.executeQuery("select * from ATTENDANCE, ATTENDANTS WHERE ATTENDENCE.ATTENDANT_NAME = ATTENDANTS.ATTENDANT_NAME AND ATTENDANTS.ATTENDANT_NAME = 'attendant1'").
但我认为这是不必要的。使用 Tim 的技术,您可以有效地删除所需的记录,而不会造成太多复杂性和性能影响。
首先,当您 post 时,您应该禁止注释 sql 查询,这会使代码更难阅读。
Tim Biegeleisen 是对的。您应该只执行一个 delete by table,但您还需要更改语句中使用的方法。
stmt.executeQuery(dell)
用于选择查询。
对于更新,请使用 stmt.executeUpdate(dell)
查看文档:
ResultSet executeQuery(String sql)
Executes the given SQL statement, which returns a single ResultSet object.
int executeUpdate(String sql)
Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.