Select 列具有不同名称时与 where 条件合并

Select union with where condition while columns have different names

场景:

表 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 保证在 2 table 秒内是不同的。

我想 select 两个 table 联合(因为它们是 1 个单一的 table),然后使用 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

但是这个查询 returns 只有第一个 table 的数据。

我刚刚看到实现此目的的一种方法是将联合包装在 select 中。

query2

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

不使用子查询是否存在孤子?

如果不是,在这种情况下(大约)使用子查询对性能有何影响?

加分题

query2中,为什么WHERE应用于第一个table?不应该是这样的:

{{
    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
}}

更新

比较子查询和接受的答案

您可以向两个查询添加相同的 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 列上有索引,你可能无法从索引中受益。但是您必须检查执行计划以查看优化器是否正确识别这种情况并按索引执行。