我有一个 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/