如何从一个中制作两行

时间:2014-09-18 16:02:37

标签: sql oracle oracle11g

我有一个相当复杂和耗时的查询,它返回一个包含两列的结果集:

 | ID1 | ID2
   1     10
   2     11
   3     15

我希望将这些结果放在一列中:

| ID
  1
  10
  2
  11
  3
  15

这是否可以在(oracle)sql中使用?

(简化)查询如下所示:

SELECT adr.nad_nkt_id id1, firmenadr.nad_nkt_id id2 FROM nav_adressen adr,
      nav_kontakte kontakt, nav_kontakte firma, nav_adressen firmenadr WHERE 
        kontakt.nkt_id = adr.nad_nkt_id AND
        firma.nkt_id (+)= kontakt.nkt_nkt_id AND
        firmenadr.nad_id (+)= firma.nkt_id AND
        (firmenadr.nad_strasse like '%needle%' OR
         adr.nad_strasse like '%needle%');

3 个答案:

答案 0 :(得分:2)

您在UNION之后:

SELECT ID1
FROM YourTable
UNION 
SELECT ID2
FROM YourTable

UNION将返回不同的项目,UNION ALL将返回所有项目(因此更快)。

考虑到您正在进行的过滤/加入的数量,首先将过滤过滤到临时表然后运行UNION

答案 1 :(得分:2)

select ID1 as ID from TableA
union
select ID2 as ID from TableA

答案 2 :(得分:1)

with source as (
SELECT adr.nad_nkt_id id1, firmenadr.nad_nkt_id id2 FROM nav_adressen adr,
  nav_kontakte kontakt, nav_kontakte firma, nav_adressen firmenadr WHERE 
    kontakt.nkt_id = adr.nad_nkt_id AND
    firma.nkt_id (+)= kontakt.nkt_nkt_id AND
    firmenadr.nad_id (+)= firma.nkt_id AND
    (firmenadr.nad_strasse like '%needle%' OR
     adr.nad_strasse like '%needle%')
)
select decode(x.l, 1, a.id1, 2, a.id2) as id
  from source a
 cross join (select level as l from dual connect by level <=2) x

在这种情况下,您不需要扫描结果集两次。它可能比union方法更快。

相关问题