比Oracle Database Union更快的选项

Sno*_*irl 2 database oracle performance union oracle10g

我有一个表有多个存储文本值的列.例如:

ID    FATHER_NAME    MOTHER_NAME
--------------------------------
1     Henry          Sarah
2     Martin         Rebecca
3     Martin         Nancy
Run Code Online (Sandbox Code Playgroud)

我想获得表中的所有名称.我知道我可以做一个工会来做到这一点:

(SELECT FATHER_NAME FROM MY_TABLE)
UNION
(SELECT MOTHER_NAME FROM MY_TABLE)
Run Code Online (Sandbox Code Playgroud)

但是,在我的真实表中,我需要联合15列,查询显然需要一段时间(大约12秒).我仍然需要加入这些名称等等.除了做工会还有其他选择吗?

仅供参考:我正在使用Oracle.

Tar*_*ryn 5

如果您使用的是Oracle 11g,则可以使用以下UNPIVOT功能:

select id, value, col
from yourtable
unpivot
(
  value for col in (FATHER_NAME, MOTHER_NAME) -- other columns will go here
) u;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle With Demo

或者你可以使用UNION ALL而不是UNION差异是你不会得到DISTINCT值:

select id, FATHER_NAME value, 'FATHER_NAME' col
from yourtable
union all
select id, MOTHER_NAME value, 'MOTHER_NAME' col
from yourtable
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle With Demo

UNION由于它试图获取DISTINCT值,可能会更慢.