2017-06-15 41 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似乎很好。