WITH子句子查询具有非唯一列名

时间:2018-05-25 17:09:26

标签: sql oracle oracle11g

我正在使用Oracle11g并希望使用WITH子句来创建一个命名的子查询,以便我可以引用"子查询"导致多个地方。我面临的问题是在下面的虚拟表的帮助下模仿。

CREATE TABLE table1(id integer, region varchar2(20), xfunction varchar2(20), entity varchar2(20), xtime varchar2(20), usd binary_double);
insert into table1 values(1,'region1','function1','entity1','2018-01',1);
insert into table1 values(2,'region2','function2','entity2','2018-02',2);

CREATE TABLE table2(id integer, product varchar2(20), market varchar2(20));
insert into table2 values(1,'product1','market1');
insert into table2 values(2,'product2','market2');

CREATE TABLE table3(id integer, geo varchar2(20));
insert into table3 values(1,'geo1');
insert into table3 values(2,'geo2');

以下查询给出了错误" ORA-00904:" V1"。" ID":无效的标识符":

with v1 as
(
select
* -- want to select all columns, this is intentional
from
table1 a
left join table2 b ON 
a.id = b.id
),
v2 as
(
select * from v1
join table3 c on
v1.id = c.id -- gives error--> ORA-00904: "V1"."ID": invalid identifier
order by
c.id
)
select * from v2;

v1有两列具有相同的列名(即" ID")。如何从v1引用table1的ID列(当表2的ID列也出现在v1中时)?

我知道我可以重新编写上面的查询而不使用WITH子句作为解决方法或者在v1中只选择一个ID列。但我真正想要的是能够使用WITH子句(在v1中有两个ID列)并使其工作。有可能吗?

2 个答案:

答案 0 :(得分:1)

Oracle支持33550336子句,它完全符合您的要求:

using

通常,我更喜欢明确地列出列 - 至少对于其中一个表。但是,我也认识到能够表达这一点的便利。

注意:仅当with v1 as ( select * from table1 a left join table2 b using (id) ), 是两个表中唯一的重复列时才有效。

答案 1 :(得分:0)

在您的情况下,问题在于加入v1 -

a.id = b.id

table1中有一个名为id1的列而不是id。使用id1运行相同的查询将输出作为 -

ID1,REGION,XFUNCTION,ENTITY,XTIME,USD,ID,PRODUCT,MARKET,ID_1,GEO
1,region1,function1,entity1,2018-01,1.0,1,product1,market1,1,geo1
2,region2,function2,entity2,2018-02,2.0,2,product2,market2,2,geo2

查询 -

with v1 as
(
select
* -- want to select all columns, this is intentional
from
table1 a
left join table2 b ON 
a.id1 = b.id
),
v2 as
(
select * from v1
join table3 c on
v1.id = c.id -- gives error--> ORA-00904: "V1"."ID": invalid identifier
order by
c.id
)
select * from v2;