我正在使用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列)并使其工作。有可能吗?
答案 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;