需要验证内连接与子查询

时间:2017-06-15 11:50:39

标签: sql sql-server

我编写了一个与子查询相当的内连接。有人能让我知道这是否是正确的做事方式,以及它是否更有效。 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

1 个答案:

答案 0 :(得分:5)

通常,带有子查询的INNER JOININ并不完全相同。问题是INNER JOIN可能会引入重复的行。

在您的情况下,这似乎不太可能,因为您正在选择ID。

具有讽刺意味的是,即使#companyId确实存在重复,也不会产生任何影响(性能除外)。那是因为你每个公司只选择一行。

所以,切换到INNER JOIN似乎很好。