在不使用集合运算符的情况下合并选择查询的结果(UNION)

Bas*_*asu 1 mysql sql

是否可以不使用联合运算符在sql中组合查询结果(与全部union / union相同)

pet*_*erm 5

假设您有两个表要 UNION

CREATE TABLE Table1
(`id` int, `name` varchar(32));
CREATE TABLE Table2
(`id` int, `name` varchar(32));
Run Code Online (Sandbox Code Playgroud)

和样本数据

表格1:

| ID | NAME |
| ---- | ------- |
| 1 | 名称1 |
| 2 | name2 |
| 3 | 名称3 |

表2:

| ID | NAME |
| ---- | -------- |
| 11 | 名称11 |
| 22 | 名称22 |
| 33 | 名称33 |
| 1 | 名称1 |

模仿 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 
Run Code Online (Sandbox Code Playgroud)

输出:

| ID | NAME |
| ---- | -------- |
| 1 | 名称1 |
| 2 | name2 |
| 3 | 名称3 |
| 11 | 名称11 |
| 22 | 名称22 |
| 33 | 名称33 |
| 1 | 名称1 |

要进行仿真,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 
Run Code Online (Sandbox Code Playgroud)

输出:

| ID | NAME |
| ---- | -------- |
| 1 | 名称1 |
| 2 | name2 |
| 3 | 名称3 |
| 11 | 名称11 |
| 22 | 名称22 |
| 33 | 名称33 |

这是SQLFiddle演示