【问题标题】:EXISTS without a second table join (self join)EXISTS 没有第二个表连接(自连接)
【发布时间】:2014-08-21 19:36:02
【问题描述】:

我有一个如下结构的表

父 ID 号、子 ID 号、地址 varchar2(100)

我想编写一个 SQL,通过在地址字段上搜索来提取所有记录。

唯一的变化是,如果 {child} 中的一个与 {address} 条件匹配,我想要 {parent id} 组合的所有记录。

我知道我们会这样编码,

SELECT parent_id, child_id, address
  FROM mytable t
 WHERE EXISTS
          (SELECT 1
             FROM mytable t2
            WHERE t.parent_id = t2.parent_id
                  AND address LIKE :p_search_criteria);

但是还有比这更好的解决方案吗?关键是我们正在检索的同一个表中搜索......

这是 Oracle 数据库 10g 企业版版本 10.2.0.4.0 - 64 位

【问题讨论】:

    标签: sql oracle exists


    【解决方案1】:

    如果需要,您可以使用分析函数来做到这一点:

    SELECT parent_id, child_id, address
    FROM (select t.*,
                 max(case when address LIKE :p_search_criteria then 1 else 0 end) over      
                     (partition by parent_id) as addrflag
          from mytable t
         ) t
    WHERE addrflag = 1;
    

    如果您有正确的索引,那么exists 版本可能仍然更快。

    【讨论】:

    • 感谢 Gordon,我将尝试一下,看看它是否更好。所以你认为在这种情况下分析功能比添加一个完整的“新”表更糟糕?我同意这一切都“取决于”并且必须衡量才能建立。我只是疯了,正在寻找任何其他选择。就是这样,谢谢!
    • 性能问题在此查询中非常开放。这取决于父母拥有的孩子数量、数据的总体大小、搜索条件的性质以及现有索引。最好的解决方案可能包含 Oracle 全文索引。
    【解决方案2】:

    我对 Oracle 本身并不熟悉,但是使用标准 SQL 查询,您不能执行以下操作吗?

    SELECT t.parent_id, t.child_id, t.address
    FROM mytable t LEFT JOIN
    mytable t2 on t.parent_id=t2.parent_id
    where t2.address LIKE :p_search_criteria;
    

    【讨论】:

    • 我可以,除了我想要的不是向查询中添加第二个表......因此加入
    猜你喜欢
    • 2012-06-30
    • 2019-10-05
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多