【问题标题】:select statement to limit results from combinations in temp table选择语句以限制临时表中组合的结果
【发布时间】:2018-01-15 23:00:36
【问题描述】:

我在这里完全是个菜鸟,我确信答案是“嗯,嗯”,但我还是被难住了。

我正在从一个表中进行选择,并使用临时表中两个字段的组合来限制我通过将我的表与上述临时表连接起来带回的记录。

以下是我的查询:

<b>select distinct company3, dept</b>
into #compdept
from fss..budget
where fyr4 = @fyrin and fmo = @fprdin
--select * from #compdept

select
          b.t_year      as fyr4,
          b.t_leac      as acct,
          b.t_cono      as company3,
          b.t_dim1      as dept,
          b.t_fdam - t_fcam       as curactamt,
          b.t_fdam * 0            as curcmpamt,
          b.t_fdam * 0            as ytdactamt,
          b.t_fdam * 0            as ytdcmpamt
    from baan5cdb..ttfgld205110 b
<b>    left join #compdept a on a.company3 = b.t_cono 
    and a.dept = b.t_dim1</b> COLLATE SQL_Latin1_General_CP1_CI_AS
    where b.t_year  = @fyrin 
      and b.t_prno  = @fprdin 

我认为上面粗体部分会将我的结果集限制为仅存在于临时表中的公司和部门组合。

但是,我在查询结果中得到了公司 110,部门 029,并且公司 3 和部门的组合在临时表 #compdept 中不存在。

我做错了什么?

谢谢。

【问题讨论】:

  • 使用内连接,而不是左外连接。外连接将允许表a 中的所有行,但内连接将只允许匹配的行
  • 为什么使用左连接而不是内连接?是时候了解它们的作用了。
  • 从你的临时表中尝试一个并离开加入 baan5cdb..ttfgld205110

标签: sql sql-server join left-join


【解决方案1】:

根据您的查询 baan5cdb..ttfgld205110 从 #compdept 返回所有记录和匹配的记录。

为了从#compdept 中仅过滤匹配的记录,一个选项是Exists Operator。示例

    SELECT  b.t_year AS fyr4 ,
            b.t_leac AS acct ,
            b.t_cono AS company3 ,
            b.t_dim1 AS dept ,
            b.t_fdam - t_fcam AS curactamt ,
            b.t_fdam * 0 AS curcmpamt ,
            b.t_fdam * 0 AS ytdactamt ,
            b.t_fdam * 0 AS ytdcmpamt
    FROM    baan5cdb..ttfgld205110 b
    WHERE   b.t_year = @fyrin
            AND b.t_prno = @fprdin
            AND EXISTS ( SELECT 1
                             FROM   #compdept a
                             WHERE  a.company3 = b.t_cono
                                    AND a.dept = b.t_dim COLLATE SQL_Latin1_General_CP1_CI_AS )

【讨论】:

    【解决方案2】:

    在第二个查询中使用临时表的内连接

    SELECT DISTINCT
          company3
        , dept INTO #compdept
    FROM fss..budget
    WHERE fyr4 = @fyrin
    AND fmo = @fprdin
    --select * from #compdept
    
    SELECT
          b.t_year          AS fyr4
        , b.t_leac          AS acct
        , b.t_cono          AS company3
        , b.t_dim1          AS dept
        , b.t_fdam - t_fcam AS curactamt
        , b.t_fdam * 0      AS curcmpamt
        , b.t_fdam * 0      AS ytdactamt
        , b.t_fdam * 0      AS ytdcmpamt
    FROM baan5cdb..ttfgld205110 b
    INNER JOIN #compdept a ON a.company3 = b.t_cono
          AND a.dept = b.t_dim1 COLLATE SQL_Latin1_General_CP1_CI_AS
    WHERE b.t_year = @fyrin
    AND b.t_prno = @fprdin
    

    外连接将允许来自表baan5cdb..ttfgld205110 的所有行,但内连接将只允许与#compdept 匹配的行。

    OR 如果打算列出临时表的每一行,即使没有匹配的行,也可以反转查询中的表位置:

    SELECT
          b.t_year          AS fyr4
        , b.t_leac          AS acct
        , b.t_cono          AS company3
        , b.t_dim1          AS dept
        , b.t_fdam - t_fcam AS curactamt
        , b.t_fdam * 0      AS curcmpamt
        , b.t_fdam * 0      AS ytdactamt
        , b.t_fdam * 0      AS ytdcmpamt
    FROM #compdept a
    LEFT JOIN baan5cdb..ttfgld205110 b ON a.company3 = b.t_cono
          AND a.dept = b.t_dim1
          AND b.t_year = @fyrin
          AND b.t_prno = @fprdin COLLATE SQL_Latin1_General_CP1_CI_AS
    

    【讨论】:

      【解决方案3】:

      试试这个:

      select  distinct 
              company3
              , dept
      into    #compdept
      from    fss..budget
      where   fyr4 = @fyrin 
      and     fmo = @fprdin
      
      select  b.t_year                as fyr4,
              b.t_leac                as acct,
              b.t_cono                as company3,
              b.t_dim1                as dept,
              (b.t_fdam - t_fcam)     as curactamt,
              b.t_fdam * 0            as curcmpamt,
              b.t_fdam * 0            as ytdactamt,
              b.t_fdam * 0            as ytdcmpamt
      from    #compdept a
      left 
      join    baan5cdb..ttfgld205110 b
              on a.company3 = b.t_cono 
              and a.dept = b.t_dim1  COLLATE SQL_Latin1_General_CP1_CI_AS
      where   b.t_year  = @fyrin 
              and b.t_prno  = @fprdin 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多