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

UNION内でのORDERBYの使用方法

    このようなものはMySQLで機能するはずです:

    SELECT a.*
      FROM ( 
             SELECT ...  FROM ... ORDER BY ... 
           ) a
     UNION ALL 
    SELECT b.*
      FROM ( 
             SELECT ...  FROM ... ORDER BY ... 
           ) b
    

    返される順序で行を返す。つまり、MySQLはORDER BYを尊重しているようです インラインビュー内の句。

    ただし、 ORDER BYがない場合 最も外側のクエリの句では、行が返される順序はではありません。 保証されています。

    特定の順序で行を返す必要がある場合は、ORDER BYを含めることができます 最も外側のクエリで。多くのユースケースでは、ORDER BYを使用するだけです。 結果を満たすために最も外側のクエリで。

    ただし、最初のクエリのすべての行を2番目のクエリのすべての行の前に返す必要があるユースケースがある場合、1つのオプションは、各クエリに追加の識別子列を含めることです。たとえば、 ,'a' AS srcを追加します 最初のクエリでは、 ,'b' AS src 2番目のクエリに移動します。

    次に、最も外側のクエリに ORDER BY src, nameを含めることができます。 、結果の順序を保証します。

    フォローアップ

    元のクエリでは、ORDER BY クエリ内はオプティマイザによって破棄されます。 ORDER BYがないため 外部クエリに適用すると、MySQLは自由に行を好きな順序で返すことができます。

    私の回答(上記)のクエリの「トリック」は、MySQLの一部のバージョンに固有の動作に依存しています。

    テストケース:

    テーブルにデータを入力

    CREATE TABLE foo2 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
    CREATE TABLE foo3 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
    
    INSERT INTO foo2 (id, role) VALUES 
      (1,'sam'),(2,'frodo'),(3,'aragorn'),(4,'pippin'),(5,'gandalf');
    INSERT INTO foo3 (id, role) VALUES 
      (1,'gimli'),(2,'boromir'),(3,'elron'),(4,'merry'),(5,'legolas');
    

    クエリ

    SELECT a.*
      FROM ( SELECT s.id, s.role
               FROM foo2 s
              ORDER BY s.role
           ) a
     UNION ALL
    SELECT b.*
      FROM ( SELECT t.id, t.role
               FROM foo3 t
              ORDER BY t.role
           ) b
    

    結果セットが返されました

        id  role     
     ------  ---------
          3  aragorn  
          2  frodo    
          5  gandalf  
          4  pippin   
          1  sam      
          2  boromir  
          3  elron    
          1  gimli    
          5  legolas  
          4  merry    
    

    foo2からの行 「順番に」返され、その後にfoo3の行が続きます 、繰り返しますが、「順番に」。

    この動作はないことに注意してください。 保証されています。 (私たちが観察する動作は、MySQLがインラインビュー(派生テーブル)を処理する方法の副作用です。この動作は、5.5以降のバージョンでは異なる場合があります。)

    特定の順序で行を返す必要がある場合は、 ORDER BYを指定します 最も外側のクエリの句。そして、その順序は全体に適用されます 結果セット。

    前述したように、最初に最初のクエリの行が必要で、次に2番目のクエリが必要な場合は、各クエリに「discriminator」列を含め、次にORDERBY句に「discriminator」列を含めます。また、インラインビューを廃止し、次のようにします。

    SELECT s.id, s.role, 's' AS src
      FROM foo2 s
     UNION ALL
    SELECT t.id, t.role, 't' AS src
      FROM foo3 t
     ORDER BY src, role
    


    1. ストリームプールにだまされてはいけません

    2. SQLServerロックの主な概念

    3. sql with-recursiveステートメントはどのように解釈されますか?

    4. SQLServerデータベースで主キー制約の有無にかかわらずすべてのテーブルを取得する方法-SQLServer/TSQLチュートリアル59