当两个表内部连接时,为什么结果集中缺少某些行

时间:2013-03-17 18:38:56

标签: sql sql-server left-join

我的查询未显示整个零行。  我的意思是..在我的输出中有一些行,其输出在所有列中为零。我的输出中没有显示特定的行。 我想在输出中连零行

我正在获得这样的输出

    abc  1  2  3 
    def  4  5  6
    xyz  2  5  4
    mng  2  5  6

但我需要的实际输出是

    abc  1  2  3 
    def  4  5  6
    ghf  0  0  0
    xyz  2  5  4
    mng  2  5  6
    jkl  0  0  0

正在消除包含零的行。

我在两个表之间使用连接..第一列我正在逐个使用。 其余的列是...的总和的结果。

输出中零的原因是,我没有辅助表中这些名称的数据..没有数据..但我想显示为零而不是错过整个列。

这是我用过的查询.....

SELECT 
    [ASACCT].ACCT_MO_I as 'Types'
    ,sum(CASE when [TECH_V].[CLOS_T]='N4' THEN 1 ELSE 0 END) AS 'N4'
    ,SUM(CASE when [TECH_V].[CLOS_T]='N3' THEN 1 ELSE 0 END) AS 'N3'
    ,SUM(CASE when [TECH_V].[CLOS_T]='N2' THEN 1 ELSE 0 END) AS 'N2'
FROM [supt_oper_anls_dw].[dbo].[TECH_V] as [TECH_V]
LEFT OUTER JOIN [supt_oper_anls_dw].[dbo].ACCT_DATE_DIM AS [ASACCT] 
    ON CONVERT(varchar(10),[ASACCT].GREG_D, 101) = CONVERT(varchar(10), [TECH_V].[OPEN_TS], 101)
WHERE 
    [TECH_INCDT_V].[KGRP_I] ='73fd71ecf84f5080217683869fd819c3'
    and ((
            [ASACCT].ACCT_MO_I >(datepart(MONTH,getdate()))-1-6 
            and [ASACCT].ACCT_MO_I <=(datepart (MONTH,getdate()))-1 
            and [ASACCT].ACCT_YR_I = (datepart(year,getdate()))
        )
        or (
            [ASACCT].ACCT_MO_I>(datepart(MONTH,getdate()))-6-1+12 
            and [ASACCT].ACCT_YR_I = (datepart(year,getdate()))-1
        ))
    and [TECH_V].Notes like '%MFTFD%'
    and [TECH_V].notes like '%DEV%'
group by 
    [ASACCT].ACCT_MO_I,[ASACCT].ACCT_YR_I

2 个答案:

答案 0 :(得分:0)

试试这个

use left or right join

答案 1 :(得分:0)

在查询中尝试LEFT JOIN。如果您执行A LEFT JOIN B,则A中的所有内容都将显示在结果中。试试这个

create table #a_table 
( a int)
insert into #a_table
values
( 100),
( 200),
( 300),
( 400)

create table #b_table 
( b int)
insert into #b_table
values
( 100),
( 200),
( 300),
( 600),
( 700),
( 900)

--inner join
select * 
from   #a_table a
    inner join #b_table b
        on a.a = b.b

--left outer join   
select * 
from   #a_table a
       left outer join #b_table b
        on a.a = b.b

然后尝试注释掉查询的各个部分,看看脚本的其他部分是否限制了返回的内容。

我怀疑如果你注释掉大部分WHERE子句,那么你想要的行将在结果集中。

在我的简化示例中,我可以添加以下WHERE子句....

select * 
from   #a_table a
       left outer join #b_table b
        on a.a = b.b
where b.b >10

......这行已经从结果中消失了。所以现在您需要开始应用ISNULLCOALESCE函数...

select * 
from   #a_table a
       left outer join #b_table b
        on a.a = b.b
where ISNULL(b.b,11) >10