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

UNIONがPostgreSQLでどのように機能するか

    PostgreSQLでは、UNION 演算子は、複数のクエリの結果を1つの結果セットに結合します。

    構文

    公式の構文は次のようになります:

    query1 UNION [ALL] query2

    UNION 演算子はquery2の結果を追加します query1の結果に (ただし、これが実際に行が返される順序であるという保証はありません)。

    UNION ALLでない限り、重複する行は削除されます 使用されます。

    次のテーブルがあるとします。

    SELECT * FROM Teachers;
    SELECT * FROM Students;

    結果:

     teacherid | teachername 
    -----------+-------------
             1 | Warren
             2 | Ben
             3 | Cathy
             4 | Cathy
             5 | Bill
             6 | Bill
    
     studentid | studentname 
    -----------+-------------
             1 | Faye
             2 | Jet
             3 | Spike
             4 | Ein
             5 | Warren
             6 | Bill

    UNIONを使用できます すべての教師と生徒を返却するオペレーター:

    SELECT TeacherName FROM Teachers
    UNION
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Spike
     Ben
     Ein
     Cathy
     Jet
     Faye
     Bill
     Warren
    (8 rows)

    デフォルトでは、UNION 演算子は暗黙的にDISTINCTを適用します 手術。つまり、デフォルトでは個別の値のみを返します。したがって、上記の結果には、ウォーレン、キャシー、ビルがそれぞれ1つずつ含まれています。これは、結合されたテーブルに実際に2つのウォーレン、2つのキャシー、および3つのビルが含まれているという事実にもかかわらずです(キャシーと呼ばれる2人の教師、ウォーレンと呼ばれる教師と顧客、およびビルと呼ばれる2人、およびビルと呼ばれる1人の学生がいます)。

    DISTINCTを明示的に使用する例を次に示します。 演算子:

    SELECT TeacherName FROM Teachers
    UNION DISTINCT
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Spike
     Ben
     Ein
     Cathy
     Jet
     Faye
     Bill
     Warren
    (8 rows)

    同じ結果。

    重複を含める

    ALLを使用できます 結果に重複する値を含めるキーワード:

    SELECT TeacherName FROM Teachers
    UNION ALL
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Warren
     Ben
     Cathy
     Cathy
     Bill
     Bill
     Faye
     Jet
     Spike
     Ein
     Warren
     Bill
    (12 rows)

    今回は、最初の例で取得した8行ではなく、12行を取得しました。

    キャシーの両方が返還され、3つの請求書すべてが返還されたことがわかります。


    1. OracleSQLの表のすべての制約の名前を表示します

    2. SQLServer2008のシンボルの前の文字列内のサブ文字列を分離する

    3. 列ASCで並べ替えますが、最初にNULL値ですか?

    4. コミットされたトランザクションをロールバックする