1

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

4

2 回答 2

5

假设你有两张桌子想要UNION

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

和样本数据

表格1:

| 身份证 | 姓名 |
|----|-------|
| 1 | 名称1 |
| 2 | 名称2 |
| 3 | 名称3 |

表2:

| 身份证 | 姓名 |
|----|--------|
| 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 

输出:

| 身份证 | 姓名 |
|----|--------|
| 1 | 名称1 |
| 2 | 名称2 |
| 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 

输出:

| 身份证 | 姓名 |
|----|--------|
| 1 | 名称1 |
| 2 | 名称2 |
| 3 | 名称3 |
| 11 | 姓名11 |
| 22 | 姓名22 |
| 33 | 姓名33 |

这是SQLFiddle演示

于 2013-09-04T04:26:16.363 回答
0

我们尝试并得到了简单的查询,但我不知道这有多有效。

CREATE TABLE tableA
  ( col1 INTEGER , col2 INTEGER
  );
CREATE TABLE tableB
  ( col1 INTEGER , col2 INTEGER
  )

// insert statements
INSERT INTO tableA
  (COL1, COL2
  ) VALUES
  (12, 13
  );
INSERT INTO tableA
  (COL1, COL2
  ) VALUES
  (14, 15
  );
INSERT INTO tableB
  (COL1, COL2
  ) VALUES
  (12, 13
  );
INSERT INTO tableB
  (COL1, COL2
  ) VALUES
  (14, 15
  );

// for union all
SELECT (
  CASE
    WHEN b.col1 IS NULL
    THEN a.col1
    ELSE b.col1
  END)
FROM
  (SELECT COL1 FROM TableB
  )b
FULL OUTER JOIN
  (SELECT COL1 FROM TableA
  ) a
ON 1=2

// for union
SELECT (
  CASE
    WHEN b.col1 IS NULL
    THEN a.col1
    WHEN b.col1=a.col1
    THEN b.col1
    ELSE b.col1
  END)
FROM
  (SELECT COL1 FROM TableB
  )b
FULL OUTER JOIN
  (SELECT COL1 FROM TableA
  ) a
ON a.col1=b.col1
于 2013-09-04T12:21:12.360 回答