替代Mysql中的UNION子句

时间:2014-02-19 10:14:47

标签: mysql sql database

我有两张桌子: - 表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;**

我需要替代它。请专家建议。

6 个答案:

答案 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 

工作小提琴:http://sqlfiddle.com/#!2/c657d8/34

答案 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不支持完全外连接。

工作演示:http://sqlfiddle.com/#!6/b7684/10