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 没有第二个表连接(自连接)的主要内容,如果未能解决你的问题,请参考以下文章