2013-03-22 80 views
1

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

什么语法,我需要用简单地加入使用Apache Derby的三个表?

我曾尝试:

我从SQLite的转换Java应用程序的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德比语法错误(通过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类似的问题在网上搜索后一般来说)。有没有办法在Apache Derby中简单地做到这一点?

安装环境:

的Java 7
的Apache Derby 10.9.1。

回答

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

+0

我没有按照你的回答。与Apache Derby一起使用时,逗号 - JOIN方法会导致语法错误(特别是在','处)。 Apache Derby ij报告:错误42X01:语法错误:在第1行第71列遇到“,”。 – SaB 2013-03-22 20:23:14

+0

第71列?为什么没有列24?如果你阅读链接,那么有连接的示例查询。 – 2013-03-22 20:29:55

+0

我看到一个链接现在被添加。谢谢你的链接。 – SaB 2013-03-23 00:13:19

1

我认为你试图混合两种不同风格的连接语法。

使用ON语法指定连接条件与使用WHERE 语法不同。

当您使用语法,你的SELECT语句应该是这样的:

SELECT列FROM T1 INNER JOIN T2在T1-T2连接条件JOIN T3 ON ...

但是,当你使用一个逗号分隔的表格列表中,您不使用ON子句,只需将所有连接条件包含到WHERE子句中即可。

所以不要混用这两种风格,只要使用其中一种。

顺便说一下,您选择的旧式样对于INNER连接非常有用,但不能用于OUTER连接,因此通常需要指定一个可导致程序员切换到ON子句样式的OUTER连接。

但是,您也可以使用ON子句进行INNER连接,只是不要给出逗号分隔的表列表。

+0

谢谢。这非常有帮助。我今天大部分时间都在处理这些变化,看看语法上的差异如何影响结果。 – SaB 2013-03-23 19:17:54