SQL中級集約演算union


集合演算union


2つのテーブルは
  • で、重複行がある場合は
  • です(重複値は含まれません).
  • SELECT DISTINCTのようにユニークなものを見せるだけでいいです.
  • UNION ALL


    2つのテーブル
  • を加算した繰返し値は
  • である.

    Full outer Join


  • mysqlはこの関数をサポートしていません.


  • だからLEFT JOINユニオンRIGHT JOINでFULL OUTER JOIN
  • ハッカーランキングの問題:SymmetricPairs

  • Symmetric Pairs

  • 答えを出す。

  • 思考フロー:
  • SELECT FROM先機
  • SELECT X,Y
    FROM Functions

  • 条件の表示:
    2-1. all such symmetric pairs in ascending order by the value of X
    SELECT X,Y
    FROM Functions
    ORDER BY X
    2-2. symmetric pairs: Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1
    2-2-1. 一つの表で引用するのでINNERJOINと書き、質問で確認してONの後に書きます.
    SELECT X,Y
    FROM Functions AS f1
    	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    ORDER BY X
    2-2-2. 印刷が必要なテーブルはf 1を基準にマージされるので、SELECT文とORDER文の列をf 1の列に変更します.
    SELECT f1.X, f1.Y
    FROM Functions AS f1
    	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    ORDER BY f1.X
    2-3. List the rows such that X1 ≤ Y1.
    SELECT f1.X, f1.Y
    FROM Functions AS f1
    	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    WHERE f1.x <= f1.y
    ORDER BY f1.X

  • 漏れがないか確認してから回します.


  • レポートはtestに戻り、エラーを確認します.
    4-1. 問題のサンプル出力には2121部はなく,ここで発生する.出力が重複している感じがする->GROUP BY
      SELECT f1.X, f1.Y
      FROM Functions AS f1
      	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
      WHERE f1.x <= f1.y
      GROUP BY f1.x, f1.y
      ORDER BY f1.X

    4-2. 依然として2121組が見えます.WHEREの後はGROUP BYではなくグループ化してから条件を設定して->WHEREをクリアし、ここの条件をHAVINGに書き込むべきだと思います
    SELECT f1.X, f1.Y
    FROM Functions AS f1
    	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    GROUP BY f1.x, f1.y
    HAVING f1.x<=f1.y
    ORDER BY f1.X

    4-3. 缲り返して感じてHAVING条件を順次確認する->f 1xSELECT f1.X, f1.Y FROM Functions AS f1 INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y GROUP BY f1.x, f1.y HAVING f1.x<f1.y ORDER BY f1.X

  • 現在,繰返し対称は解消されているようだが,=条件が奪われたため,誤りが残っている.サンプルクエリー文を作成して、同じ条件があるかどうかを決定します.
    SELECT X,Y
    FROM Functions
    GROUP BY X,Y
    

    5-1. 数が多すぎて確定しにくいので、出力の個数を確認します->SELECT文でカウントします(*)
    SELECT X,Y, COUNT(*)
    FROM Functions
    GROUP BY X,Y   

    5-2. どれも1つのようなので目では見えにくいですしたがって、1つ以上の->HAVING COUNT(*)>1があることを確認してください
    SELECT X,Y, COUNT(*)
    FROM Functions
    GROUP BY X,Y
    HAVING COUNT(*) >1    

    5-3. 確認13 13ペア2個ずつ->先ほど4回作成したクエリーでHAVING節ORでCOUNT(*)>1を追加
    SELECT f1.X, f1.Y
    FROM Functions AS f1
    	INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    GROUP BY f1.x, f1.y
    HAVING f1.x<f1.y OR COUNT(*) >1    
    ORDER BY f1.X

  • やっと正解!
  • には次のものがあります.
    対称を実現するには、対を偶数で割る2の場合、0とする場合は
  • である.
    SELECT f1.X, f1.Y
    FROM Functions AS f1
        INNER JOIN Functions AS f2 ON f1.X = f2.Y AND f2.X = f1.Y
    GROUP BY f1.x, f1.y
    HAVING f1.x<f1.y OR COUNT(*) % 2 = 0    
    ORDER BY f1.X

    説明する。

  • UNIONを使用して
  • を解読
  • HINT:問題の出力の中でXとYが同じである場合、Xにマージする
    SELECT X,Y
    FROM Functions
    WHERE X=Y
    GROUP BY X, Y 
    HAVING COUNT(*)>1
    
    UNION
    
    SELECT f1.X, f1.Y
    FROM Functions AS f1
        INNER JOIN Functions As f2 ON f1.X = f2.y AND f2.X = f1.Y
    WHERE f1.X < f1.Y
    ORDER BY X