选择带有where条件的union,而列具有不同的名称

7uhlpewt  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(294)

脚本:
表1:

city_id     |   city_name       | ...
-------------------------------------
1           |   Aaaa
2           |   Bbb
3           |   Ccc
4           |   Ddd
...

表2:

region_id   |   region_name     | ...
-------------------------------------
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...

预期结果:

id          |   name     | ...
-------------------------------------
3           |   Ccc
4           |   Ddd
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...

两个表中的id保证是不同的。
我想选择两个具有并集的表(因为它们是一个单表),然后使用 WHERE 查询1

SELECT
    city_id     AS 'id',
    city_name   AS 'name'
FROM table1
UNION
SELECT
    region_id   AS 'id',
    region_name AS 'name'
FROM table2
WHERE 'id' > 2

但是这个查询只返回第一个表中的数据。
我刚刚看到实现这一点的一种方法是将联合体 Package 在一个select中。
查询2

SELECT * FROM (
    SELECT
        city_id     AS 'id',
        city_name   AS 'name'
    FROM table1
    UNION
        region_id   AS 'id',
        region_name AS 'name'
    FROM table2
) AS t
WHERE t.id > 2

有没有不使用子查询的孤子?
如果不是,在这种情况下(大约)使用子查询对性能有何影响?
奖金问题
在查询2中,为什么 WHERE 应用于第一个表?是不是应该是这样的:

{{
    SELECT
        city_id     AS 'id',
        city_name   AS 'name'
    FROM table1
}}
UNION
{{
    SELECT
        region_id   AS 'id',
        region_name AS 'name'
    FROM table2
    WHERE 'id' > 2
}}

更新

比较子查询和接受答案
0-1k行:子查询速度慢约20%。
1k-100k行:待办事项

zlhcx6iw

zlhcx6iw1#

您可以向两个查询添加相同的where子句:

SELECT
    city_id     AS 'id',
    city_name   AS 'name'
FROM table1
WHERE city_id > 2
UNION
    region_id   AS 'id',
    region_name AS 'name'
FROM table2
WHERE region_id > 2
;

至于与性能相关的问题,如果在计算union子查询之后计算where子句,并且id列上有索引,那么您可能无法从索引中获益。但是您必须检查执行计划,以查看优化器是否正确地识别了这种情况,并按索引进行了处理。

相关问题