如何在oracle中实现'Only in'条件?
如何在oracle中实现'Only in'条件?如何在oracle中实现'Only in'条件?
我有两个表'PlanPlanSet'和'ExcludedPlans'。 PlanPlanSet包含与每个计划关联的计划和计划集。我想从计划ONLY IN ExcludedPlans中的PlanPlanSet获取所有记录。
PlanPlanSet表
Plan1 - Planset1 Plan2 - Planset2
Plan3 - Planset3
Plan4 - Planset1
Plan5 - Planset5
ExcludedPlans表
Plan1 Plan2
这里Planset1包含计划1和Plan4,并Planset2只包含计划2。因此Planset1不应排除,Planset2应排除在外。
喜欢的东西,
select pps.planset from PlanPlanSet pps
where pps.planNumber only in (select ex.planNumber
from ExcludedPlan ex);
回答:
你想PLANSETS中的每一个计划都在排除计划列表中。
关于这个关系的思考,你需要将这两张表连在一起,并发现每一面的计划数量是相同的。这意味着我们必须允许它们有不同的意思,表示左外连接。
select p.planset from plansets p
left outer join excludedplans e
on p.plan = e.plan
group by p.planset
having count(p.plan) = count(e.plan)
这个假设PLANSETS是PLANSET并计划唯一的,并且EXCLUDEDPLANS是计划唯一的。如果这个假设是不正确,那么你就需要count(distinct ...
如果你想从PLANSETS那么逻辑可投入的解析函数的所有数据
select * from (select p.*
, count(p.plan) over (partition by p.planset) as planset_ct
, count(e.plan) over (partition by p.planset) as excluded_ct
from plansets p
left outer join excludedplans e
on p.plan = e.plan
)
where planset_ct = excluded_ct
回答:
据说这是为了找到只有这样plansets其中的所有计划都存在于ExcludedPlans表。如果需要此类计划集的所有行,则省略第一行中的独特行,并添加所需的任何列。
Select distinct planset From PlanPlanSet ps1
Where
exists
(
Select selected.planset
From
(
Select ps2.planset, count(*) ct, sum(decode(ep2.plan, null, 0, 1)) present
From PlanPlanSet ps2
Left join ExcludedPlans ep2 on ep2.plan = ps2.plan
Group by ps2.planset
) selected
Where selected.ct = selected.present and ps1.planset = selected.planset
)
如果相反只有这样plansets这并不是所有的计划都出现在ExcludedPlans表应该被选中,然后更改子查询的WHERE条件selected.all <> selected.present
回答:
该查询返回PlanPlanSet
这些都是记录套仅排除计划:
select * from PlanPlanSet pss where not exists
(select planname from planPlanSet x
where x.setname = pss.setname
minus
select planname from ExcludedPlans)
/
减号来产生一组从不在底部子查询存在顶子查询的记录。当结果为空集时,计划集仅包含排除的计划。 MINUS不是一个非常快速的操作,所以如果你有大量的记录要处理,这可能不是最好的方法。但是,它具有检索PlanPlanSet
列的优势,而不仅仅是setname
。
LiveSQL demo.
以上是 如何在oracle中实现'Only in'条件? 的全部内容, 来源链接: utcz.com/qa/265475.html