我一直在尝试从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分为自身的子列,这是同一表中的列。
答案 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