在SQL Server中提取空字段

时间:2011-10-13 14:58:58

标签: sql sql-server tsql

我会尽量详细说明。我们的公司控制员已向我询问有关供应商的一些信息。以下是表格:

spp =供应商表,每个供应商有一条记录,有5222条记录 ast =供应商帐户配置文件,此表与spp之间存在(M,1)关系,此表中有8,950条记录。每个重复的spp_id都有一个不同的atp_id,这是一个事务配置文件 crt =银行帐户信息,供应商可能有也可能没有银行帐户信息 xvd =检查表的表,xvd.xcd_id是保存检查表id的字段。检查表0007是包含折扣信息的表。

这是我的剧本:

select spp.spp_id supp_num,
   spp.spp_matchname supp_name,
   case when spp.spp_ddcalculation = 0 
       then 'End of Month' 
       else
       case when spp.spp_ddcalculation = 1 
           then 'Net' 
           else
           case when spp.spp_ddcalculation = 2 
               then 'End of 10, 20, 30' 
               else 
               case when spp.spp_ddcalculation = 3
                   then 'End of 15 or 30'
                   else null
               end 
           end 
       end 
   end calculation1,                                              
   convert(varchar(2), spp.spp_ddduration) + case when spp.spp_ddmd = 0 
                                                 then ' Days' 
                                                 else case when spp.spp_ddmd = 1
                                                     then ' Months'
                                                     else null
                                                 end 
                                             end duration1,
   spp.spp_ddday stop_day1,
   xvd.xvd_desc discount,
   crt.crt_name bank,
   case when ast.ast_ddcalculation = 0 
       then 'End of Month' 
       else
       case when ast.ast_ddcalculation = 1 
           then 'Net' 
           else
           case when ast.ast_ddcalculation = 2 
               then 'End of 10, 20, 30' 
               else case when ast.ast_ddcalculation = 3
                   then 'End of 15 or 30' 
                   else null
               end
           end 
       end 
   end     
   calculation2,
   convert(varchar(2), ast.ast_ddduration) + case when ast.ast_ddmd = 0 
                                                 then ' Days' 
                                                 else case when ast.ast_ddmd = 1
                                                     then ' Months'
                                                     else null
                                                 end 
                                             end                            
   duration2,
   ast.ast_ddday stop_day2

from spp left join ast on spp.spp_id = ast.spp_id
     left join crt on ast.crt_id = crt.crt_id
     inner join xvd on ast.cfd_id = xvd.xcv_id 

where xvd.xcd_id = '0007'
    and xvd.lng_id = 0

order by spp.spp_id

问题是ast表中有371条记录具有非null cfd_id,这是与检查表0007中的折扣相关的字段。当我运行时,我得到371条记录,但我需要所有供应商,即使是那些有零折扣的人。我知道问题是我的连接和检查表0007中没有空xcv_id的事实。任何人都可以看到我忽略的任何明显的东西吗?

总结一下,ast中有8,950条记录,但只有371条记录为非null cfd_id。我需要抓住所有8,950条记录,我似乎无法提取空折扣。我想我可以将所有内容都放到临时表中然后获取折扣,但我想知道是否有办法在一个选择语句中执行此操作。

由于

编辑:我的from语句的最后一行似乎是主要问题 inner join xvd on ast.cfd_id = xvd.xcv_id

没有null xcv_id但是有cfd_id。除了检查相等性之外,还有另一种方法可以加入这两个表吗?

忘记提及,我们在SQL Server 2008 R2上。

3 个答案:

答案 0 :(得分:0)

我认为您可以将内部联接更改为左联接:

from spp left join ast on spp.spp_id = ast.spp_id 
left join crt on ast.crt_id = crt.crt_id  
inner join xvd on ast.cfd_id = xvd.xcv_id 

from spp left join ast on spp.spp_id = ast.spp_id 
left join crt on ast.crt_id = crt.crt_id 
left join xvd on ast.cfd_id = xvd.xcv_id 

如果您要选择xvd.xcd_id0007null的记录,请将where子句更改为:

(xvd.xcd_id = '0007' OR xvd.xcd_id is null)

答案 1 :(得分:0)

这是否解决了这个问题?

FROM   spp
   LEFT JOIN ast
     ON spp.spp_id = ast.spp_id
   LEFT JOIN crt
     ON ast.crt_id = crt.crt_id
   INNER JOIN xvd
     ON xvd.xcv_id = ast.cfd_id
WHERE  xvd.xcd_id = '0007'
   AND xvd.lng_id = 0

答案 2 :(得分:0)

这听起来非常适合观看。您可以构建一系列视图,这些视图可以按照您希望的方式过滤数据,而不是尝试构建一个复杂的查询...然后将最终查询应用到最后一个视图。