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
}}
更新
比较子查询和接受的答案
- 0 - 1k 行:子查询慢了 ~20%。
- 1k - 100k 行:TODO
您可以向两个查询添加相同的 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 列上有索引,你可能无法从索引中受益。但是您必须检查执行计划以查看优化器是否正确识别这种情况并按索引执行。
场景:
表 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
}}
更新
比较子查询和接受的答案
- 0 - 1k 行:子查询慢了 ~20%。
- 1k - 100k 行:TODO
您可以向两个查询添加相同的 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 列上有索引,你可能无法从索引中受益。但是您必须检查执行计划以查看优化器是否正确识别这种情况并按索引执行。