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

集合演算子を使用せずにselectクエリの結果を組み合わせる(UNION)

    UNIONしたいテーブルが2つあるとしましょう。

    CREATE TABLE Table1
    (`id` int, `name` varchar(32));
    CREATE TABLE Table2
    (`id` int, `name` varchar(32));
    

    そしてサンプルデータ

    表1:

    | ID |  NAME |
    |----|-------|
    |  1 | name1 |
    |  2 | name2 |
    |  3 | name3 |
    

    表2:

    | ID |  NAME  |
    |----|--------|
    | 11 | name11 |
    | 22 | name22 |
    | 33 | name33 |
    |  1 |  name1 |
    

    UNION ALLをエミュレートするには

    SELECT COALESCE(t1.id, t2.id) id,
           COALESCE(t1.name, t2.name) name
      FROM 
    (
      SELECT TABLE_NAME <> 'table1' n
        FROM INFORMATION_SCHEMA.TABLES
       WHERE TABLE_SCHEMA = SCHEMA()
         AND TABLE_NAME IN('table1', 'table2')
    ) t LEFT JOIN table1 t1 
        ON t.n = 0 LEFT JOIN table2 t2
        ON t.n = 1 
    

    出力:

    | ID |   NAME |
    |----|--------|
    |  1 |  name1 |
    |  2 |  name2 |
    |  3 |  name3 |
    | 11 | name11 |
    | 22 | name22 |
    | 33 | name33 |
    |  1 |  name1 |
    

    UNIONをエミュレートするには DISTINCTを追加するだけです

    SELECT DISTINCT COALESCE(t1.id, t2.id) id,
           COALESCE(t1.name, t2.name) name
      FROM 
    (
      SELECT TABLE_NAME <> 'table1' n
        FROM INFORMATION_SCHEMA.TABLES
       WHERE TABLE_SCHEMA = SCHEMA()
         AND TABLE_NAME IN('table1', 'table2')
    ) t LEFT JOIN table1 t1 
        ON t.n = 0 LEFT JOIN table2 t2
        ON t.n = 1 
    

    出力:

    | ID |   NAME |
    |----|--------|
    |  1 |  name1 |
    |  2 |  name2 |
    |  3 |  name3 |
    | 11 | name11 |
    | 22 | name22 |
    | 33 | name33 |
    

    こちらがSQLFiddle です。 デモ



    1. SSMSでのアクセス許可の問題:オブジェクト'extended_properties'、データベース'mssqlsystem_resource'、...エラー229でSELECTアクセス許可が拒否されました

    2. MariaDB JSON_TYPE()の説明

    3. MySQLvarcharインデックスの長さ

    4. 動的SQL-EXEC(@SQL)とEXEC SP_EXECUTESQL(@SQL)