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

Posted

技术标签:

【中文标题】EXISTS 没有第二个表连接(自连接)【英文标题】:EXISTS without a second table join (self join) 【发布时间】: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 位

【问题讨论】:

【参考方案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;

【讨论】:

我可以,除了我想要的不是向查询中添加第二个表......因此加入

以上是关于EXISTS 没有第二个表连接(自连接)的主要内容,如果未能解决你的问题,请参考以下文章

在多个连接条件下将数据从第二个表插入一个表

laravel 中的两个表连接和计算第二个表列

Laravel 连接 2 个表,第一个表中的一个数据和第二个表中的多行

左连接计数来自第二个表的三个属性

如果第二个表不存在连接,Mysql 使用一个表中的列值

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来