2016-08-19 7 views
2

私はAテーブル、Bテーブル10の異なる表(123 .. 10)を持って参加します。入力に基づいて、これらの10、A、およびBのいずれか1つ以上のテーブルに参加してデータを選択する必要があります。は、選択したテーブル

例:入力のみ2,5,8,10であれば、私はAB258、および10テーブルを結合し、データを取得する必要があります。入力が1で、テーブルが7の場合は、AB1、および7テーブルを結合してデータを取得する必要があります。

----サンプルそんな20でなければなりません-----

suppose A is a person table with p_id, p_name, order_id,....... 
B is an order table with Order_id,......... 
each 1-10 tables are shopping items like clothes, shoes, electronics,...etc 

今、私はこれらの日付や年齢内のようないくつかの他の制約にのみ服や靴を注文した人の詳細を引きたい 私は人テーブル、注文テーブル、洋服テーブル、靴テーブルだけに参加しなければならず、両方のテーブルのいずれかを予約した人について詳細を尋ねました。唯一の靴を持っている人や腰掛けをする必要はありません。結果は、彼が注文した服の数、彼が注文した靴の数と同じになります。

誰でも私にそれをどうやって考えてもらえますか? 私はoracle dbでSQLを使用しています。

+3

サンプルテーブルのデータと期待される結果を追加します。 – jarlh

+2

質問がアップアップされた場合、私は質問を理解できない場合、私が何か間違っている人であることを意味する必要があります... – sstan

+0

jarlhは十分ですか、私はいくつかの詳細を追加したいですか?私の質問が愚かであれば、私には新しいことを教えてください。 – bvk48

答えて

0

普通のSQLではこれを処理できないと思います。動的SQLを使用する必要があるようです。結合する必要のあるテーブルのパラメータを含むストアドプロシージャを用意し、そのプロシージャの呼び出し方法に基づいてクエリを作成します。即時実行でクエリを実行してください...もっと詳しく読む:https://docs.oracle.com/cloud/latest/db112/LNPLS/dynamic.htm#LNPLS011

更新:私はあなたの実際のデータを持っていないので、ここに擬似plsqlのサンプルがあります。このことができます

DECLARE 
    table1 VARCHAR2 (100) := 'Table1'; 
    table2 VARCHAR2 (100) := ''; 
    table3 VARCHAR2 (100) := 'Table2'; 
    ... 
    table10 VARCHAR2 (100) := 'Table10'; 
    query VARCHAR2 (4000) := ''; 
BEGIN 
--create the core join between A and B 
    query := query || 'select A.p_id, A.p_name, B.order_id from A, B where A.order_id = B.order_id '; 
    IF (table1 != '') THEN query := query || ' and a.id = table1.id '; 
    --if statements for the rest of your tables and add the join condition for each table to the query string 
... 

EXECUTE IMMEDIATE query; --run the query... depends on what you want to do with the returned result you can use RETURN INTO or BULK COLLECT INTO... 

EXCEPTION 
    WHEN OTHERS 
    THEN 
    DBMS_OUTPUT.put_line (SQLERRM); 
END; 

希望...

+0

答えをありがとう。サブルーチンを使って私に答えてください。 – bvk48

+0

うん。これは私を助けます。ありがとう男 – bvk48

0

これはSQLベースである:私はあなたに与えられた情報と、セットアップで実際のコードを記述することはできません - これはあなたに続行する方法についてのアイデアを与えることですサーバー構文を変数にまで拡張していますが、うまくいけばそれをOracle変数に変換できます。とにかく、トリックはLEFT JOINの条件として入力変数を使用することです。そうすれば、変数の条件がfalseの場合、そのテーブルから行が返されなくなります。 trueの場合、一致が返されます。 LEFT JOINではなくINNER JOINにしたい場合は、WHERE条件にcase文を入れて、変数条件が満たされている場合に真にします。

DECLARE @IncludeT1 BIT, @IncludeT2 BIT 

SELECT * 
FROM 
    TableA a 
    INNER JOIN TableB B 
    ON a.somecol = b.somecol 
    LEFT JOIN Table1 t1 
    ON a.somecol = t1.somecol 
    AND @IncludeT1 = 1 
    LEFT JOIN Table2 t2 
    ON b.somecol = t2.solmcol 
    AND @IncludeT1 = 1 
WHERE 
    (CASE WHEN (@IncludeT1 = 1 and t1.someid IS NOT NULL) OR @IncludeT1 = 0 THEN 1 ELSE 0 END) = 1 
    AND (CASE WHEN (@IncludeT2 = 1 and t2.someid IS NOT NULL) OR @IncludeT2 = 0 THEN 1 ELSE 0 END) = 1 

また、動的なSQLを使用して実行することもできます。これは、別の答えでは、そのルートに進むとさらに考慮すべきことが示唆されているためです。

+0

ありがとうございました。私はいくつかのアイデアを得た。 – bvk48

0

実際には10種類のテーブルは、の商品カテゴリのちょうど10種類しかないようです。です。

ProductCategory(衣服、靴、電子機器など)の追加欄を持つ大きなProductsテーブルにそれらをすべて均質化することは可能ですか?あなたの割り当てはこのProductCategoryフィールドの単純なWHEREに縮小されます。

UNIONでスキーマを変更せずに同等の(効率は低いですが)viewを実行すると、割り当てを行うことができます。

これはあなたの質問に直接答えることはできませんが、これにより問題が大幅に簡素化され、データベースが正常化されるため、複雑な解決策(これはいつも好ましい方法です)が不要になります。

+0

情報ありがとうございましたJon。ええ、私たちはそれをすることができますが、実際にはそれらの10のカテゴリーは異なります。説明するだけで、私はその事例を取ったので私の場合はそうすることができません – bvk48

0

パイプライニング関数の動的SQLに行ってください。

その場でsqlを作成し、execute immediateで実行し、行ごとにresulsを返します。見てくださいhere。全く受け入れられた答えは存在しないこと

注意、しかし、私は

ヴィンセントマルグラットの

アプローチはうまくやるだろうと思います。

関連する問題