Sql 如何使用不同的约束跨联合选择部分共享参数值?
我有一个观点Sql 如何使用不同的约束跨联合选择部分共享参数值?,sql,oracle,view,Sql,Oracle,View,我有一个观点 create or replace view v_collected as select car.id_car ,car.state_car ,[..] from cars car ,garages garage ,[..] where [..] 这至少对car.id是唯一的 现在,我想将3个不同的查询合并到第二个视图中,该视图采用用户设置的参数: select 0 as score ,p
create or replace view v_collected as
select car.id_car
,car.state_car
,[..]
from cars car
,garages garage
,[..]
where [..]
这至少对car.id是唯一的
现在,我想将3个不同的查询合并到第二个视图中,该视图采用用户设置的参数:
select 0 as score
,p0.*
from v_collected p0
where 1 = 1
-- User IO Binding
and p0.car = 'Audi'
and p0.garage = 'P01'
and p0.state_car = 'Ok'
union
select 1 as score
,p1.*
from v_collected p1
where 1 = 1
-- Should access the identical binding
and p1.car <> p0.car
and p1.state_car = p0.state_car
union
select 2 as score
,p2.*
from v_collected p2
where 1 = 1
-- Should access the identical binding
and p2.state_car = p0.state_car
由于第二个查询无法访问第一个查询,因此上述操作不起作用。随着约束条件的变化,我相信我不能使用CTE。我的选择是什么?由于需求是模糊的,我不能确定以下解决方案是否完整,但是,我会考虑将p0、p1、p2分解为带有子句的子查询,这样您可以在p1和p2中使用p0。例如:
with cars as
(
select 2 id_car, 'Ford' car, 'Ok' state_car from dual union
select 1 id_car, 'Audi' car, 'Ok' state_car from dual
)
, garages as
(
select 2 id_car, 'P02' garage from dual union
select 1 id_car, 'P01' garage from dual
)
, v_collected as
(
select car.id_car
,car.car
,car.state_car
,garage.garage
from cars car
,garages garage
where 1=1
and car.id_car = garage.id_car
)
-- select * from v_collected;
, p0_subquery as
(
select 0 as score
,p0.*
from v_collected p0
where 1 = 1
-- User IO Binding
and p0.car = 'Audi'
and p0.garage = 'P01'
and p0.state_car = 'Ok'
)
--select * from p0_subquery;
, p1_subquery as
(
select 1 as score
,p1.*
from v_collected p1
, p0_subquery p0
where 1 = 1
-- Should access the identical binding
and p1.car <> p0.car
and p1.state_car = p0.state_car
)
, p2_subquery as
(
select 2 as score
,p2.*
from v_collected p2
, p0_subquery p0
where 1 = 1
-- Should access the identical binding
and p2.state_car = p0.state_car
)
select * from p0_subquery
union
select * from p1_subquery
union
select * from p2_subquery
;
我相信我不能使用CTE为什么?