如何在ApacheDerby数据库中连接三个表



问题:

我需要使用什么语法来使用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子句,只是不要给出逗号分隔的表列表。

最新更新