甲骨文12.2
我有一条SQL语句会引起问题。我正在从一个名为BURNDOWN的表中检索数据。如果用户是管理员,他们就可以查看所有数据。如果用户不是管理员,则根据某些联接条件,他们被限制在可以看到的范围内。我遇到的问题是当用户是管理员时,我不需要其他表…随后,联接条件与此无关,因此甲骨文决定在所有…中执行笛卡儿连接。如何解决这个问题,即用户是一个管理员,我只看一个表,否则我查看所有表并包含连接条件?
示例SQL是一个人为的示例,但它显示了问题。
Select
BURNDOWN.NAME,
BURNDOWN.ADDRESS,
BURNDOWN.STATE
from BURNDOWN, FILTER_A, FILTER_B, FILTER_C
Where
(
:ISAdmin = 1
Or
(
BURNDOWN.x=FILTER_A.x and
FILTER_A.y=FILTER_B.y and
FILTER_B.z=FILTER_C.z and
FILTER_C.user = :ThisUser
)
)发布于 2018-08-11 18:18:39
使用EXISTS查看数据是否存在于FILTER表中,而不将它们加入到结果中。
select bd.*
from burndown bd
where ( :isadmin = 1 or
exists ( select 1
from filter_a a
inner join filter_b b on b.y = a.y
inner join filter_c c on c.z = b.z
where a.x = bd.x
and c.user = :ThisUser )
)发布于 2018-08-11 13:38:44
想必,你想:
select bd.*
from burndown bd
where :ISAdmin = 1 or
(exists (select 1 from FILTER_A a where bd.x = a.x) or
exists (select 1 from FILTER_B b where bd.y = b.y) or
exists (select 1 from FILTER_C c where bd.z = c.z)
);https://stackoverflow.com/questions/51800050
复制相似问题