没有第二个表连接的EXISTS(自连接)

时间:2014-08-21 19:36:03

标签: sql oracle exists

我有一个以下结构表

父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位

2 个答案:

答案 0 :(得分: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版本可能会更快。

答案 1 :(得分:0)

我本身并不熟悉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;
相关问题