查看在表上具有自联接
Posted
技术标签:
【中文标题】查看在表上具有自联接【英文标题】:View having self join on table 【发布时间】:2013-03-14 21:57:35 【问题描述】:我想创建一个视图,我需要一个包含自连接的查询。我担心它的性能和行为,因为它将获取大量数据。表和查询的详细信息如下(原始表有更多列,我将需要多列的结果;这只是为您提供一个示例):-人员表
PK NAME SPOUSE_REF_ID IS_MARRIED
1 John Null Y
2 Alice 1 Y
3 Varvatos Null Y
4 Barbara 5 Y
5 Stanely Null Y
6 Ross Null N
7 Henry Null N
我需要查询已婚且有supper_ref_id的人的数据。因此我提出的查询是:-
select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
pf.employment_category_id
from person a
inner join person pf on
a.id = pf.spouse_ref_id
where a.IS_MARRIED ='Y'
请就其优化向我提出建议,如果您认为重组查询会获得更好的结果,或者在查询等中不建议使用自联接等。 我将不胜感激具有优化视图的回复。
【问题讨论】:
您有什么问题,或者有什么问题吗? 由于自联接是执行此操作的唯一方法,因此您无能为力。有时您可以用分析函数替换自联接,但在这种情况下不能 【参考方案1】:当您查询视图时,在后台执行用于构造视图的查询,然后将适当的数据返回给您。
有时,我注意到使用带有连接的 where 子句会获取意想不到的结果。因此,我建议您将原始查询修改为以下内容:-
select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
pf.employment_category_id
from person a
inner join person pf on
a.id = pf.spouse_ref_id
and a.IS_MARRIED ='Y'
您可以做的另一个优化是在配偶参考ID上创建一个(唯一索引)/(索引)。这将确保当您进行自连接时,它不会对两个实例进行全表扫描。我不确定以下查询是否会产生更好的结果或您想要的结果(但值得一试):-
select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
pf.employment_category_id
from person a
inner join person pf on
a.id = pf.spouse_ref_id
and a.IS_MARRIED ='Y'
and pf.IS_MARRIED='Y'
【讨论】:
我强烈不同意将谓词和连接条件都放在ON
子句中的建议。在某些情况下,它可能会提高可读性,但不会使您免于意外结果。需要更多细节来支持应该避免使用极其常见的查询方法的断言。
+1 for @jonearles 评论——我发现在连接中放置类似条件的唯一一次是在外部连接中。以上是关于查看在表上具有自联接的主要内容,如果未能解决你的问题,请参考以下文章