问题:
使用Apache Derby简单地连接三个表需要使用什么语法?
我尝试了什么:
我正在将Java应用程序从SQLite转换为Apache Derby。 在SQLite中,以下SQL语法可以正常工作。
sql.append("SELECT MatterDataset.id, ");
//Removed rest of selection items for readability and to focus the inquiry
sql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog " ) ; //<--PROBLEM LINE
sql.append(" ON MatterDataset.matterid = DocumentClassification.matterid " ) ;
sql.append(" AND MatterDataset.matterid = PrivilegeLog.matterid " ) ;
sql.append(" AND MatterDataset.id = DocumentClassification.documentid " ) ;
sql.append(" AND MatterDataset.id = PrivilegeLog.documentparentid " ) ;
sql.append(" WHERE " ) ;
sql.append(" Matterdataset.matterid = ? " ) ; //Prepared statement
sql.append(" AND Matterdataset.isdeleted = 0 " ) ;
导致转换为Apache Derby问题的行是:
sql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog " ) ;
我尝试了几种变体,并且都使用Java Derby(通过ij工具)引发语法错误。
1)',''语法错误,但此语法仅适用于两个表
sql.append(" FROM MatterDataset JOIN DocumentClassification, PrivilegeLog " ) ;
2)如上所述直接和“,”
的SYNTAX ERRORsql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog " ) ; //
3)“AND”的语法错误
sql.append(" FROM MatterDataset JOIN DocumentClassification AND PrivilegeLog " ) ; //
我不确定还有什么可以尝试(在执行网络搜索以解决类似的SQL问题之后)。有没有办法在Apache Derby中执行此操作?
环境设置:
Java 7
Apache Derby 10.9.1。
答案 0 :(得分:2)
您只需使用,
sql.append("SELECT MatterDataset.id ");
//Removed rest of selection items for readability and to focus the inquiry
sql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog " ) ; //<--NOT A PROBLEM LINE
sql.append(" WHERE " ) ;
sql.append(" MatterDataset.id = DocumentClassification.matterid " ) ;
sql.append(" AND MatterDataset.id = PrivilegeLog.matterid " ) ;
sql.append(" AND DocumentClassification.id = PrivilegeLog.documentparentid " ) ;
sql.append(" AND Matterdataset.id = ? " ) ; //Prepared statement
sql.append(" AND Matterdataset.isdeleted = 0 " ) ;
Derby数据库也可以是optimized for performance。
答案 1 :(得分:1)
我认为你试图混合两种不同风格的连接语法。
使用ON语法指定连接条件与使用WHERE的方式不同 语法。
使用ON语法时,SELECT语句应如下所示:
SELECT列FROM T1 INNER JOIN T2 ON t1-t2 join condition JOIN T3 ON ...
但是当你使用逗号分隔的表列表时,你不使用ON子句,只需将所有连接条件都归入WHERE子句。
所以不要混用这两种风格,只需使用其中一种。
顺便说一下,您选择的旧样式非常适合INNER连接,但不能用于OUTER连接,因此通常需要指定一个OUTER连接,使程序员切换到ON子句样式。
但是你也可以在INNER连接中使用ON子句,只是不要给逗号分隔的表列表。