まず、この問題はJOINまたはUNIONについてではないと言いたいと思います。 また、私が試したスタックオーバーフローに関するいくつかの回答がありますが、まだ問題があります。 (例:Multiple queries executed in java in single statement)jdbc - 1つのクエリ内の複数のselect文
問題:
私は、彼らが異なるタイプのデータを含んでいるのでJOINまたはUNION使用して行うことができない二つのテーブルからデータを取得したい と私は異なる数の行から後です各テーブル。なぜなら、私はそれを一度にやりたいのですが、誰かが2つの呼び出しでオーバーヘッドにほとんど差がないと私に納得させることができれば、私は喜んで問題を解決します。 1つのクエリのみ)を使用する方法を知って
コード:
thisに基づいて、私は次のコード(抜粋)を書いた:
String sql = "SET @organizationId = 0;" +
"SELECT @organizationId := Id 'Id', Name FROM Organization WHERE Id = ?;" +
"SELECT AssociatedOrganizationId FROM OrganizationAssociations WHERE OrganizationId = @organizationId;";
Connection conn = null;
try {
conn = dataSource.getConnection();
CallableStatement cs = conn.prepareCall(sql);
cs.setInt(1, organizationId);
boolean isResultSet = cs.execute();
if (!isResultSet) {
logger.error("getOrganization - retrieved result is not a ResultSet");
}
OrganizationDto organization = null;
ResultSet rs = cs.getResultSet();
if (rs.next()) {
// create organization object using retrieved data
}
rs.close();
行動が問題の原因を
cs.execute()は常にfalseを返します。私は問題を解決しようとするのにかかった
観測と行動:
hereを明記し、Javaのドキュメントで、CallableStatementのは、ストアドプロシージャを呼び出すために使用されるように設計されていたよう。ストアドプロシージャ自体は決して値を返しません。これはOUTパラメータによってのみ達成できます。 それを念頭に置いて、私は驚いていません。.execute()はfalseを返します。 は私がのPreparedStatementと声明にのCallableStatementをしかし、変更されているが、それは、結果の面であまり変化しなかった()cs.getResultSet(はまだヌルを返した)私は
の回答検索:
1. jdbcの複数のSELECT文を使用して1つのクエリを使用して複数のテーブルからデータを取得する方法を知りたい。これは、JOINS、UNIONSなどなしで達成することです。可能ならば、私がすでに持っているクエリを使用できるようにしたいのです(クエリはHeidiSQLで完全にうまく動作します)。
2.(オプション)データベースの負荷とパフォーマンスの点で2つのクエリであまり差がないと思う人がいる場合は、これが実際に当てはまると確信したいと思います。
更新#1:
のResultSet#1:
ID、名前
1、 "org1_name"
ResultSetを
明確にするために、これは私のクエリが返すデータであり、 #2:
AssociatedOrganizationId
プロシージャを使用し、2つのカーソルを戻して使用します。Callableステートメントでどのような問題が発生しましたか? –
ストアドプロシージャを作成するのではなく、そのままクエリを使用できますか?私は.NETの背景から来て、これらのようなクエリは珍しいことではありません。 説明したように、CallableStatement.execute()は私の場合は常にfalseを返します(おそらく、私はOUTパラメータを持つストアドプロシージャを呼び出していないため) – JakeDiscBrake
ありがとう@GordThompson。他の誰かがこれが実際にMySQLでそれを行う唯一の方法であることを確認できれば、私はストアドプロシージャを作成し、これを解決する方法です。 – JakeDiscBrake