1

質問:

Apache Derby を使用して 3 つのテーブルを単純に結合するには、どの構文を使用する必要がありますか?

私が試したこと:

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) ',' での構文エラーですが、この構文は 2 つのテーブルでしか機能しません

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 全般に関する同様の問題について Web 検索を実行した後)。Apache Derby で簡単にこれを行う方法はありますか?

環境設定:

Java 7
アパッチ ダービー 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

2つの異なるスタイルの結合構文を混在させようとしていたと思います。

ON構文を使用して結合条件を指定することは、WHERE構文を使用することとは異なるスタイルです。

ON構文を使用する場合、SELECTステートメントは次のようになります。

T1から列を選択INNERJOINT2ONt1-t2結合条件JOINT3ON .. ..

ただし、コンマ区切りのテーブルリストを使用する場合は、ON句を使用せず、すべての結合条件をWHERE句にまとめるだけです。

したがって、2つのスタイルを混在させるのではなく、どちらか一方を使用してください。

ちなみに、選択した古いスタイルはINNER結合には最適ですが、OUTER結合には使用できないため、通常、プログラマーがON句スタイルに切り替える原因となるOUTER結合を指定する必要があります。

ただし、INNER結合にもON句を使用できます。コンマ区切りのテーブルリストを指定しないでください。

于 2013-03-23T14:43:52.180 に答える