1

问题:

我需要使用什么语法来使用 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)直接如上和“,”处的语法错误

sql.append(" FROM MatterDataset, DocumentClassification, PrivilegeLog  " ) ; // 

3) "AND" 处的语法错误

sql.append(" FROM MatterDataset JOIN DocumentClassification AND PrivilegeLog  " ) ; // 

我不确定还可以尝试什么(在对一般 SQL 的类似问题进行网络搜索之后)。有没有办法在 Apache Derby 中简单地做到这一点?

环境设置:

Java 7
Apache 德比 10.9.1。

4

2 回答 2

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 数据库也可以针对性能进行优化

于 2013-03-22T20:16:35.673 回答
1

我认为您试图混合两种不同样式的连接语法。

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

当您使用 ON 语法时,您的 SELECT 语句应如下所示:

SELECT columns FROM T1 INNER JOIN T2 ON t1-t2 连接条件 JOIN T3 ON ...

但是当您使用逗号分隔的表列表时,您不使用 ON 子句,您只需将所有连接条件集中到 WHERE 子句中。

所以不要混合两种风格,只使用一种或另一种。

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

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

于 2013-03-23T14:43:52.180 回答