首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle选择过滤导致笛卡儿

Oracle选择过滤导致笛卡儿
EN

Stack Overflow用户
提问于 2018-08-11 13:16:03
回答 2查看 45关注 0票数 1

甲骨文12.2

我有一条SQL语句会引起问题。我正在从一个名为BURNDOWN的表中检索数据。如果用户是管理员,他们就可以查看所有数据。如果用户不是管理员,则根据某些联接条件,他们被限制在可以看到的范围内。我遇到的问题是当用户是管理员时,我不需要其他表…随后,联接条件与此无关,因此甲骨文决定在所有…中执行笛卡儿连接。如何解决这个问题,即用户是一个管理员,我只看一个表,否则我查看所有表并包含连接条件?

示例SQL是一个人为的示例,但它显示了问题。

代码语言:javascript
复制
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
 )
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-11 18:18:39

使用EXISTS查看数据是否存在于FILTER表中,而不将它们加入到结果中。

代码语言:javascript
复制
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 )
       )
票数 1
EN

Stack Overflow用户

发布于 2018-08-11 13:38:44

想必,你想:

代码语言:javascript
复制
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)
      );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51800050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档