如何在Apache Derby数据库中连接三个表?

时间:2013-03-22 20:00:42

标签: java sql derby

问题:

使用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 ERROR
sql.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。

2 个答案:

答案 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子句,只是不要给逗号分隔的表列表。