mysql - 如何选择一列中可在两个不同列中使用的值列表?

标签 mysql sql

我有一个 tableX:

|-column1-|-column2-|
|   a1    |   b4    |
|   a2    |   b5    |
|   a3    |   b6    |

我想将这些值选择到单个列中作为结果:

|-result--|
|   a1    |
|   a2    |
|   a3    |
|   b4    |
|   b5    |
|   b6    |

这看起来很简单,但我看到的所有问题都只是将值连接/合并到单个列中。我需要将它们添加为“列表”。

我可以使用 union 子句,例如:

select column1 as result from tableX
UNION
select column2 as result from tableX

但性能会很差(慢 2 倍),而且我的 SQL 语句会很大,因为 tableX 是一个非常复杂的子查询(不利于维护和可读性)。

标记为 MySQL,但我会接受所有 DBMS 的答案

最佳答案

首先,我建议union all而不是union,所以:

select column1 as result from tableX
union all
select column2 as result from tableX;

union 会产生删除重复项的开销。如果 tableX 是一个表,那么这可能没问题。虽然表被扫描了两次,但在大多数情况下,表页面已经在页面缓存中,因此第二次扫描应该比第一次快得多。

如果tableX确实是一个复杂的 View ,您可以做一些更有效的事情:

select (case when n.n = 1 then column1 else column2 end) as column
from tableX cross join
     (select 1 as n union all select 2) n;

如果您仍然需要删除重复项,请使用select unique:

select distinct (case when n.n = 1 then column1 else column2 end) as column
from tableX cross join
     (select 1 as n union all select 2) n;

但是,这可能会抵消任何性能提升。

关于mysql - 如何选择一列中可在两个不同列中使用的值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51537296/

相关文章:

php - 如何在 MYSQL 语句中包含 HTML

javascript - 为什么我从 Loopback4 收到“访问被拒绝”错误,同时能够使用相同的凭据从 MySql 工作台进行连接

mysql - 如何计算投票分数为零或正面的帖子数量?

sql - 如何对 PostgreSQL 中的列的一部分进行分组?

mysql - 用户定义的函数仅返回NULL

java - 如何在使用 JDBC 驱动程序和 MySQL DBMS 时回滚 CREATE TABLE 和 DROP TABLE 等 DDL 语句?

mysql - mySQL 5.5 中范围的 SQL 错误

java - 如何将组合框选定的项目pk插入mysql?

SQL 子字符串\g

sql - 如何编写 sql 语句来根据另一个表中的组计算总计?