【问题标题】:Select union with where condition while columns have different names选择具有 where 条件的联合,而列具有不同的名称
【发布时间】:2018-12-12 17:58:58
【问题描述】:

场景:

表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
...

保证 2 个表的 ID 不同。

我想用 union 选择两个表(因为它们是 1 个单表),然后使用 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

但是这个查询只返回第一个表中的数据。

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

查询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

有没有不使用子查询的孤子?

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

额外问题

query2 中,为什么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 行:TODO

【问题讨论】:

  • SELECT city_id AS 'id', city_name AS 'name' FROM table1 仅返回表 1 中的 id 和城市名称,这就是为什么:"this query returns only data from 1st table."
  • 编辑您的问题并向我们展示您对结果的期望

标签: mysql union union-all


【解决方案1】:

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

【讨论】:

  • 这么简单,我觉得很笨。问题:如果两个表具有相同的列名,我的 query1 会按预期工作,还是我仍需要在两个查询中输入 WHERE
猜你喜欢
  • 2011-03-31
  • 2021-12-26
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
相关资源
最近更新 更多