2017-01-06 7 views
3

まず、この問題はJOINまたはUNIONについてではないと言いたいと思います。 また、私が試したスタックオーバーフローに関するいくつかの回答がありますが、まだ問題があります。 (例:Multiple queries executed in java in single statementjdbc - 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

+0

プロシージャを使用し、2つのカーソルを戻して使用します。Callableステートメントでどのような問題が発生しましたか? –

+0

ストアドプロシージャを作成するのではなく、そのままクエリを使用できますか?私は.NETの背景から来て、これらのようなクエリは珍しいことではありません。 説明したように、CallableStatement.execute()は私の場合は常にfalseを返します(おそらく、私はOUTパラメータを持つストアドプロシージャを呼び出していないため) – JakeDiscBrake

+0

ありがとう@GordThompson。他の誰かがこれが実際にMySQLでそれを行う唯一の方法であることを確認できれば、私はストアドプロシージャを作成し、これを解決する方法です。 – JakeDiscBrake

答えて

-1

まず、あなたの2つのクエリを結合を使用して単一のクエリのように書くことができます。

SELECT AssociatedOrganizationId 
FROM OrganizationAssociations oi 
WHERE oa.OrganizationId = ? 

SELECT AssociatedOrganizationId 
FROM OrganizationAssociations oi JOIN 
    Organization o 
    ON oa.OrganizationId = o.id 
WHERE o.id = ? 

セカンドをあなたに全体を簡素化することができるので、これをしても、必要とされていません

私はSQLを勉強し、データベースの仕組みを学ぶために時間をとることをお勧めします。それはおそらくあなたが解決したい問題であなたを助けるでしょう。

+0

あなたが必要とするのは、関連する組織ID(1つのテーブルのみ)です。 組織(組織テーブル)と関連する組織ID(OrganizationAssociationsテーブル)のリストについての詳細が必要です。 私のクエリの結果は{Id、Name} AND {AssociatedOrganizationId}です。最初のResultSetには1つの行が含まれ、他のResultSetには複数の行が含まれます。 – JakeDiscBrake

+0

はゴードンの前提が正しいようです。サンプルデータと希望の出力を投稿することで間違っていることをご確認ください – e4c5

+0

@ e4c5 - 私の質問 – JakeDiscBrake

関連する問題