如何在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。
您可以连接的表只需用,
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。
我认为你试图混合两种不同风格的连接语法。
使用ON语法指定连接条件与使用WHERE 语法不同。
当您使用语法,你的SELECT语句应该是这样的:
SELECT列FROM T1 INNER JOIN T2在T1-T2连接条件JOIN T3 ON ...
但是,当你使用一个逗号分隔的表格列表中,您不使用ON子句,只需将所有连接条件包含到WHERE子句中即可。
所以不要混用这两种风格,只要使用其中一种。
顺便说一下,您选择的旧式样对于INNER连接非常有用,但不能用于OUTER连接,因此通常需要指定一个可导致程序员切换到ON子句样式的OUTER连接。
但是,您也可以使用ON子句进行INNER连接,只是不要给出逗号分隔的表列表。
谢谢。这非常有帮助。我今天大部分时间都在处理这些变化,看看语法上的差异如何影响结果。 – SaB 2013-03-23 19:17:54
我没有按照你的回答。与Apache Derby一起使用时,逗号 - JOIN方法会导致语法错误(特别是在','处)。 Apache Derby ij报告:错误42X01:语法错误:在第1行第71列遇到“,”。 – SaB 2013-03-22 20:23:14
第71列?为什么没有列24?如果你阅读链接,那么有连接的示例查询。 – 2013-03-22 20:29:55
我看到一个链接现在被添加。谢谢你的链接。 – SaB 2013-03-23 00:13:19