我有两张桌子: - 表a,表b。
表a
--- --- ID
1
2
3
4
5
7
表b
--- ---- ID
2
3
4
5
6
如果没有 UNION 命令,我必须得到这样的输出: -
---- ----- ID
1
2
3
4
5
6
7
注意:我有一个带工会的解决方案: -
**select * from a
UNION
select * from b;**
我需要替代它。请专家建议。
答案 0 :(得分:5)
我们需要另一个包含(至少)2行的表:
CREATE TABLE d
( id INT NOT NULL
);
INSERT INTO d
(id)
VALUES
(0), (1) ;
然后,如果我们想只有一个查询,我们可以使用(这是为了好玩,不要在生产中使用,这就是为什么我们有 UNION
强>):
SELECT DISTINCT
COALESCE(aa.id, bb.id) AS id
FROM
d
LEFT JOIN a AS aa ON d.id = 0
LEFT JOIN b AS bb ON d.id = 1
WHERE
COALESCE(aa.id, bb.id) IS NOT NULL
ORDER BY
id ;
在 SQLfiddle.com 和其他表格组合中进行测试:
1 row - 1 row
2 rows - 2 rows
0 rows - 1 row
0 rows - 2 rows
0 rows - 0 rows
答案 1 :(得分:4)
试试这个:
我认为它在MS-SQL中运行良好,如果需要可以将其更改为MySQL,但是MYSql不支持完全外连接!祝你好运
SELECT (
CASE
WHEN b.ID IS NULL
THEN a.ID
WHEN b.ID=a.ID
THEN b.ID
ELSE b.ID
END)
FROM
(SELECT ID FROM table2
)b
FULL OUTER JOIN
(SELECT ID FROM table1
) a
ON a.ID=b.ID
并使用查询 小提琴:http://sqlfiddle.com/#!3/c657d/13
这是MYSQL版本:
SELECT DISTINCT COALESCE(t1.id, t2.id) id
FROM
(
SELECT TABLE_NAME <> 'table_a' n
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = SCHEMA()
AND TABLE_NAME IN('table_a', 'table_b')
) t LEFT JOIN table_a t1
ON t.n = 0 LEFT JOIN table_b t2
ON t.n = 1
答案 2 :(得分:1)
我不知道你为什么要避免UNION
,但你可以这样做
CREATE TABLE temp_ids(ID INT);
INSERT INTO temp_ids SELECT ID FROM a;
INSERT INTO temp_ids SELECT ID FROM b;
SELECT DISTINCT ID FROM temp_ids;
答案 3 :(得分:0)
尝试完整的外部联接并过滤NULL
值。
答案 4 :(得分:0)
作为一个抽象的练习(如果这是一个面试问题,我们期待一个回扣!)一个丑陋,无效的解决方案是创建一个笛卡尔积并过滤唯一值:
SELECT DISTINCT IF(a<>b, b.id, a.id)
FROM a, b
ORDER BY 1
;
答案 5 :(得分:0)
使用FULL OUTER JOIN
,如下所示:
SELECT CASE
WHEN t1.id IS NULL THEN t2.id
ELSE t1.id
END AS id
FROM t1
FULL OUTER JOIN t2
ON t1.id = t2.id
ORDER BY id
注意:Mysql不支持完全外连接。