具有SELECT AS子查询的Oracle SQL UNION

时间:2018-10-08 08:26:29

标签: sql oracle select union

我一直在尝试从SELECT语句创建视图,该视图应该从表中获取某些字段。问题是我需要至少两次使用同一字段,具体取决于其foo和bar。我正在尝试做类似的事情

SELECT x, y FROM 
( 
(SELECT foo from table where abc='TYPE 1') as x
UNION
(SELECT foo from table where def='TYPE 2') as y
) table;

该语句失败,因为我似乎无法在UNION语句中使用“ as x”和“ as y”。有什么办法可以绕过它?

L.E。: 我需要的是以下内容:

SELECT x, y FROM 
(
(SELECT foo from table where abc='TYPE 1') as x,
(SELECT foo from table where def='TYPE 2') as y
) table

其中x和y是foo,它是一个数字。 基本表是:

FOO |  ABC   |  DEF
_________________________
100 | TYPE 1 | ----
300 | ------ | TYPE 2

预期输出为:

 X  |  Y  |  ABC   |  DEF
_________________________
100 | --- | TYPE 1 | ----
--- | 300 | ------ | TYPE 2

我需要根据abc和def将foo分为自身的子列,这是同一表中的列。

4 个答案:

答案 0 :(得分:2)

查询子查询时可供选择的列仅限于该子查询本身选择的列。所以以下是我在这里写的内容:

SELECT foo FROM yourTable WHERE abc = 'TYPE 1'
UNION ALL
SELECT foo FROM yourTable WHERE def = 'TYPE 2';

我使用UNION ALL,因为如果您确实要使用UNION并删除重复项,那么以下单个查询将与您的原始尝试相同:

SELECT DISTINCT foo
FROM yourTable
WHERE abc = 'TYPE 1' OR def = 'TYPE 2';

编辑:

也许你想要这个:

SELECT foo, 'TYPE 1' AS type FROM yourTable WHERE abc = 'TYPE 1'
UNION ALL
SELECT foo, 'TYPE 2' FROM yourTable WHERE def = 'TYPE 2'
ORDER BY type, foo;

答案 1 :(得分:1)

您尝试获取columns而不是rows,因此不是UNION。您可以尝试以下操作(假设您有一个名为id的主键列):

create table "table" ( id int, foo varchar(10), abc varchar(100), def varchar(100));
insert into "table" values(1, 'abc', 'TYPE 1', 'TYPE 2');
insert into "table" values(2, 'def', 'TYPE 3', 'TYPE 2');

SELECT  
    (SELECT foo from "table" where abc='TYPE 1' and id = t2.id ) as x,
    (SELECT foo from "table" where def='TYPE 2' and id = t2.id ) as y
 FROM "table" t2;

 X    Y
---  ---
abc  abc
def

答案 2 :(得分:1)

因为您期望从同一张表中获得该信息。

**请根据需要在下面相应地更改大小写,尝试以下操作

select distinct c.*
from (select foo, null, abc, null
      from table a
      where abc = 'type 1'
      union all
      select null, abc, null, def
      from table b
      where def = 'type 2'
     ) c ;

答案 3 :(得分:0)

您可以使用此技术创建2个临时表,然后将它们联接

WITH 
     X AS (SELECT FOO FROM TABLE WHERE  ABC = 'TYPE 1'),
     Y AS (SELECT FOO FROM TABLE WHERE  DEF = 'TYPE 2')

SELECT * FROM X
UNION
SELECT * FROM Y