问题描述
我有一个表,该表具有多个存储文本值的列.例如:
I have a table that has multiple columns which store a text value. For example:
ID FATHER_NAME MOTHER_NAME
--------------------------------
1 Henry Sarah
2 Martin Rebecca
3 Martin Nancy
我想获取表中的所有名称.我知道我可以做一个工会来做到这一点:
I want to get all of the names in the table. I know I can do a union to do this:
(SELECT FATHER_NAME FROM MY_TABLE)
UNION
(SELECT MOTHER_NAME FROM MY_TABLE)
但是,在我的实际表中,我需要合并15列,而查询显然要花一点时间(大约12秒).而且我仍然需要对这些名称进行联接,等等.进行工会还有其他选择吗?
However, in my real table there are 15 columns I need to union and the query is obviously taking awhile (approximately 12 seconds). And I still need to do joins on these names, etc. Is there any other alternative to doing unions?
仅供参考:我正在使用Oracle.
FYI: I am using Oracle.
推荐答案
如果使用的是Oracle 11g,则可以使用UNPIVOT
函数:
If you are using Oracle 11g, you can use the UNPIVOT
function:
select id, value, col
from yourtable
unpivot
(
value for col in (FATHER_NAME, MOTHER_NAME) -- other columns will go here
) u;
请参见带有演示的SQL小提琴
或者您可以使用UNION ALL
代替UNION
,不同之处在于您将不会获得DISTINCT
值:
Or you can use UNION ALL
instead of UNION
the difference is you will not get DISTINCT
values:
select id, FATHER_NAME value, 'FATHER_NAME' col
from yourtable
union all
select id, MOTHER_NAME value, 'MOTHER_NAME' col
from yourtable
请参见带有演示的SQL小提琴
UNION
可能会由于尝试获取DISTINCT
值而变慢.
The UNION
might be slower due to it attempting to get the DISTINCT
values.
这篇关于比Oracle Database Union更快的选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!