2017-06-15 47 views
4

我写了一个子查询的内部连接等效项。有人能让我知道这是否是正确的做事方式,如果是更有效的方式。是否开启关键字过滤方式where子句需要验证内部连接和子查询

子查询

select 
     companyId, 
     fiscalYear, 
     fiscalQuarter, 
     periodenddate 
    into #PeriodTbl 
    from( 
     select 
      fp.companyId, 
      fp.fiscalYear, 
      fp.fiscalQuarter, 
      fi.periodenddate, 
      ROW_NUMBER() OVER (PARTITION BY fp.companyId, fp.fiscalYear, fp.fiscalQuarter ORDER BY fi.periodEndDate DESC) rowno 
     from ciqfinperiod fp 
      join ciqfininstance fi on fi.financialperiodid = fp.financialperiodid 
     where fp.periodtypeid = 4 
      and fi.periodenddate > @date 
      and fi.latestforfinancialperiodflag = 1 
      and latestfilingforinstanceflag = 1 
      and fp.companyId in (select id from #companyId) 

     ) a 
    where a.rowno = 1 

内加入

select 
     companyId, 
     fiscalYear, 
     fiscalQuarter, 
     periodenddate 
    into #PeriodTbl 
    from( 
     select 
      fp.companyId, 
      fp.fiscalYear, 
      fp.fiscalQuarter, 
      fi.periodenddate, 
      ROW_NUMBER() OVER (PARTITION BY fp.companyId, fp.fiscalYear, fp.fiscalQuarter ORDER BY fi.periodEndDate DESC) rowno 
     from ciqfinperiod fp inner join #companyId ci on fp.companyId = ci.id 
      join ciqfininstance fi on fi.financialperiodid = fp.financialperiodid 
     where fp.periodtypeid = 4 
      and fi.periodenddate > @date 
      and fi.latestforfinancialperiodflag = 1 
      and latestfilingforinstanceflag = 1 
      --and fp.companyId in (select id from #companyId) 

     ) a 
    where a.rowno = 1 

回答

5

一般来说,INNER JOININ与子查询相同的是不完全的相同。问题是INNER JOIN可能会引入重复的行。

就你而言,这似乎不太可能,因为你选择的是ID。具有讽刺意味的是,即使#companyId确实有重复,那么它也不会有所作为(除了性能方面)。那是因为你每个公司只选择一行。

因此,切换到INNER JOIN似乎很好。