我编写了一个与子查询相当的内连接。有人能让我知道这是否是正确的做事方式,以及它是否更有效。 ON关键字的过滤方式与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
答案 0 :(得分:5)
通常,带有子查询的INNER JOIN
和IN
并不完全相同。问题是INNER JOIN
可能会引入重复的行。
在您的情况下,这似乎不太可能,因为您正在选择ID。
具有讽刺意味的是,即使#companyId
确实存在重复,也不会产生任何影响(性能除外)。那是因为你每个公司只选择一行。
所以,切换到INNER JOIN
似乎很好。