脚本:
表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行:待办事项
1条答案
按热度按时间zlhcx6iw1#
您可以向两个查询添加相同的where子句:
至于与性能相关的问题,如果在计算union子查询之后计算where子句,并且id列上有索引,那么您可能无法从索引中获益。但是您必须检查执行计划,以查看优化器是否正确地识别了这种情况,并按索引进行了处理。