sql >> データベース >  >> RDS >> Oracle

共通の列(A、B)と(A、C)を持つ2つのクエリを1つの(A、B、C)に変換するにはどうすればよいですか?

    まず、2つのクエリが単なるテーブルであると想像してください。これを行う:

    select a.producer, a.firstquerycolumn, b.secondquerycolumn
    from table1 a
    join table2 b on b.producer = a.producer
    

    各テーブルをクエリ(インラインビューと呼ばれます)に置き換えることができます:

    select a.Prod, a.AnimalsBought, b.AnimalsExploration
    from
    ( select Producers.name Prod, count(Animals.idanimal) AnimalsBought
      from AnimalsBought, Animals, Producers
      where (AnimalsBought.idanimal = Animals.idanimal) 
      and (Animals.owner = Producers.nif) 
      group by Producers.name
    ) a
    join
    ( select Producers.name Prod, count(Animals.idanimal) AnimalsExploration
      from AnimalsExploration, Animals, Producers
      where (AnimalsExploration.idanimal = Animals.idanimal) 
      and (Animals.owner = Producers.nif)
      group by Producers.name
    ) b
    on a.Prod = b.Prod;
    

    一方のクエリがプロデューサーのデータを返し、もう一方のクエリが返さない場合は、「結合」を「完全外部結合」に変更する必要があります。また、次のようにクエリを再構築して、2つのサブクエリに外部結合されたプロデューサーに関するメインクエリを作成する傾向があります(プロデューサーは削除されています):

    select Producers.name Prod, a.AnimalsBought, b.AnimalsExploration
    from Producers
    left outer join ( select Animals.owner, count(AnimalsBought.idanimal) AnimalsBought
                        from AnimalsBought, Animals
                       where AnimalsBought.idanimal = Animals.idanimal
                       group by Animals.owner
                    ) a
               on a.owner = Producers.nif
    left outer join ( select Animals.owner, count(Animals.idanimal) AnimalsExploration
                        from AnimalsExploration, Animals
                       where AnimalsExploration.idanimal = Animals.idanimal
                       group by Animals.owner
                    ) b
               on b.owner = Producers.nif;
    

    (以下のパフォーマンスをテストしたのは、このタイプのクエリです。)

    おそらくOPに関係のない情報でこの回答を肥大化させるのではなく、Oracleでのスカラーサブクエリとインラインビューの相対的なパフォーマンスに関する私のメモ(PerformanceDBAによって要求された)はここでオフラインになりました:パフォーマンスに関するメモ



    1. Oracleでのクロスジョイン

    2. SQLビューを使用したMicrosoftAccessでのデータの追加/編集

    3. Oracle GROUP_CONCAT()と同等

    4. テーブル値パラメータをC#からOracleストアドプロシージャに渡す方法