问题:
我需要使用什么语法来使用ApacheDerby简单地连接三个表?
我尝试过的:
我正在将一个Java应用程序从SQLite转换为ApacheDerby。在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 " ) ;
我已经尝试了几种变体,所有变体都会使用JavaDerby(通过ij工具(引发语法错误。
1( ","处的语法错误,但此语法仅适用于两个表
sql.append(" FROM MatterDataset JOIN DocumentClassification, PrivilegeLog " ) ;
2( 如上所述的直接和","处的语法错误
sql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog " ) ; //
3( "与"处的语法错误
sql.append(" FROM MatterDataset JOIN DocumentClassification AND PrivilegeLog " ) ; //
我不确定还能尝试什么(在对SQL的类似问题进行网络搜索后(。有没有一种方法可以简单地在ApacheDerby中做到这一点?
环境设置:
Java 7
Apache Derby 10.9.1。
您可以简单地使用,
连接表
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数据库也可以针对性能进行优化。
我认为您试图混合使用两种不同风格的联接语法。
使用ON语法指定联接条件与使用WHERE不同语法。
当您使用ON语法时,SELECT语句应该看起来像:
SELECT列FROM T1 INNER JOIN T2 ON T1-T2联接条件JOIN T3 ON。。。
但是,当您使用逗号分隔的表列表时,您不使用ON子句,您只需将所有联接条件集中到WHERE子句中。
所以不要把这两种风格混在一起,只使用其中一种。
顺便说一句,您选择的旧样式非常适合INNER联接,但不能用于OUTER联接,因此通常需要指定OUTER联接才能使程序员切换到ON子句样式。
但是您也可以对INNER联接使用ON子句,只是不要给出逗号分隔的表列表。