Oracle SQL - 选择性过滤导致笛卡尔
Oracle SQL - selective filtering causes cartesian
甲骨文 12.2
我有一个 SQL 语句导致我出现问题。我正在从名为 BURNDOWN 的 table 中检索数据。如果用户是管理员,他们可以看到所有数据。如果用户不是管理员,则根据某些加入条件,他们只能看到他们可以看到的内容。
我 运行 遇到的问题是当用户是管理员时,我不需要其他 tables ......随后,JOIN 条件不相关,因此 Oracle 决定进行笛卡尔连接跨越一切……
我如何解决这个问题,以便用户是管理员,我只查看一个 table,否则我查看所有 table 并包括加入条件?
示例 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
)
)
据推测,您想要:
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)
);
使用 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 )
)
甲骨文 12.2
我有一个 SQL 语句导致我出现问题。我正在从名为 BURNDOWN 的 table 中检索数据。如果用户是管理员,他们可以看到所有数据。如果用户不是管理员,则根据某些加入条件,他们只能看到他们可以看到的内容。 我 运行 遇到的问题是当用户是管理员时,我不需要其他 tables ......随后,JOIN 条件不相关,因此 Oracle 决定进行笛卡尔连接跨越一切…… 我如何解决这个问题,以便用户是管理员,我只查看一个 table,否则我查看所有 table 并包括加入条件?
示例 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
)
)
据推测,您想要:
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)
);
使用 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 )
)