是否可以不使用联合运算符组合sql中的查询结果(与联合/联合全部相同)
问问题
1303 次
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 回答