【问题标题】:Select where: classification and its children选择位置:分类及其子项
【发布时间】:2020-11-07 20:26:18
【问题描述】:

我有一个查询,我选择分类 = 60280 或分类是 60280 的子级的工单:

select
    wo.*
from
    workorder wo
where
    exists (select 1 from classancestor where ((ancestor = '60280')) and (classstructureid=wo.classstructureid))

(就其价值而言,这类似于 Advanced Search window 在 Maximo 列表视图中的功能。)

虽然上面的查询运行良好,但我怀疑由于子查询的原因,它无法在大表上很好地扩展。

有没有办法在不使用子查询的情况下选择一个分类及其子类?

【问题讨论】:

  • 您可以将其重写为 JOIN,但不能保证它会更有效。 Oracle 将根据您想要的信息创建执行计划。
  • 我不明白。在这个词的解释中,你说的是“分类= xyz”。在您的 WHERE 条件下,我没有看到类似的情况。我错过了什么?
  • 好的 - 我看到了你所做的编辑。我还是不明白。我看到您正在寻找祖先 = '60280'。我仍然看不到您在哪里寻找“分类”本身为“60280”的行。 (我也没有看到你的表定义,所以我不知道“分类”是什么 - 我想这是因为这个问题非常具体地是关于 maximo,我没有听说过.) 在任何情况下-似乎分层(CONNECT BY)查询可能是您最好的选择。但是,你已经有了一个“正确答案”,所以我猜你已经不在乎了。

标签: sql oracle query-performance maximo oracle18c


【解决方案1】:
select
    wo.*
from
    workorder wo join classancestor ca on (ca.classstructureid=wo.classstructureid)
where
    ca.ancestor = '60280'

但这不一定更好,因为 Oracle 会根据需要进行优化。尝试运行几次,看看会发生什么。

【讨论】:

    【解决方案2】:

    我改编了@Mankowitz 的回答:

    select
        wo.*
    from
        workorder wo 
    left join 
        classancestor ca 
        on ca.classstructureid = wo.classstructureid
    where
        ca.ancestor = '60280'
     
        and woclass in ('WORKORDER', 'ACTIVITY') 
        and historyflag = 0 
        and istask = 0
    

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多