查看在表上具有自联接

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 评论——我发现在连接中放置类似条件的唯一一次是在外部连接中。

以上是关于查看在表上具有自联接的主要内容,如果未能解决你的问题,请参考以下文章

自联接的困难 MySQL 更新查询

自联接、子查询或其他?

SQL Server - 使用内部查询自联接更新值的代码

根据主键在表上以正确的顺序插入行。

忽略单峰的内部联接

plsql数据库查找完表直接在表上修改怎么弄