下面代码是SCCM中的SQL报表代码
使用inner join连起来的结果经常会出现漏项
比如
如下信息:
CPU  主板  内存 显卡
P4   865   2G    6600GT
P3   815   null   TNT
I7   P55   4G      HD6950如果用类似下面代码查询的话第二条P3 CPU的那行就不会出现在结果中如何才能实现,如果值为null 则在结果中显示null呢?select  distinct 
 v_R_System_Valid.ResourceID, 
 v_R_System_Valid.Netbios_Name0 AS [Computer Name], 
 v_R_System_Valid.Resource_Domain_OR_Workgr0 AS [Domain/Workgroup], 
 v_Site.SiteName as [SMS Site Name], 
 [Top Console User] = CASE 
 when (v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 is NULL or v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 = '-1') 
 then 'Unknown' 
 Else v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 
 End, 
 v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System], 
 v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack Level], 
 v_GS_SYSTEM_ENCLOSURE_UNIQUE.SerialNumber0 AS [Serial Number], 
 v_GS_SYSTEM_ENCLOSURE_UNIQUE.SMBIOSAssetTag0 AS [Asset Tag], 
 v_GS_COMPUTER_SYSTEM.Manufacturer0 AS [Manufacturer], 
 v_GS_COMPUTER_SYSTEM.Model0 AS [Model], 
 v_GS_X86_PC_MEMORY.TotalPhysicalMemory0 AS [Memory (KBytes)], 
 v_GS_PROCESSOR.NormSpeed0 AS [Processor (GHz)], 
 (Select sum(Size0) 
 from v_GS_LOGICAL_DISK inner join v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = v_GS_LOGICAL_DISK.ResourceID ) 
  where v_GS_LOGICAL_DISK.ResourceID =v_R_System_Valid.ResourceID and 
  v_FullCollectionMembership.CollectionID = @CollectionID) As [Disk Space (MB)], 
 (Select sum(v_GS_LOGICAL_DISK.FreeSpace0) 
 from v_GS_LOGICAL_DISK inner join v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = v_GS_LOGICAL_DISK.ResourceID ) 
 where v_GS_LOGICAL_DISK.ResourceID =v_R_System_Valid.ResourceID and v_FullCollectionMembership.CollectionID = @CollectionID) As [Free Disk Space (MB)] 
 from v_R_System_Valid 
 inner join v_GS_OPERATING_SYSTEM on (v_GS_OPERATING_SYSTEM.ResourceID = v_R_System_Valid.ResourceID) 
 left join v_GS_SYSTEM_ENCLOSURE_UNIQUE on (v_GS_SYSTEM_ENCLOSURE_UNIQUE.ResourceID = v_R_System_Valid.ResourceID) 
 inner join v_GS_COMPUTER_SYSTEM on (v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System_Valid.ResourceID) 
 inner join v_GS_X86_PC_MEMORY on (v_GS_X86_PC_MEMORY.ResourceID = v_R_System_Valid.ResourceID) 
 inner join v_GS_PROCESSOR on (v_GS_PROCESSOR.ResourceID = v_R_System_Valid.ResourceID) 
 inner join v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = v_R_System_Valid.ResourceID) 
 left  join v_Site on (v_FullCollectionMembership.SiteCode = v_Site.SiteCode) 
 inner join v_GS_LOGICAL_DISK on (v_GS_LOGICAL_DISK.ResourceID = v_R_System_Valid.ResourceID) and v_GS_LOGICAL_DISK.DeviceID0=SUBSTRING(v_GS_OPERATING_SYSTEM.WindowsDirectory0,1,2) 
 left join v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP on (v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.ResourceID = v_R_System_Valid.ResourceID) 
 Where v_FullCollectionMembership.CollectionID = @CollectionID 
 Order by v_R_System_Valid.Netbios_Name0

解决方案 »

  1.   


    就是单个查询都能查到比如:
    有几个30岁的人A,B,C
    A"工作"=教师
    B"工作"=null
    C"工作"=警察
    如果 "年纪"="年纪"则返回 "工作"
    这个查询结果中就不会出现B
    用inner join 起来就会有漏项 ,排查后发现漏掉的都是 null的
      

  2.   

    那就用left join.最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
    如果有多表,表之间如何关联?
    发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  3.   

    on isnull(a.id,'~~') = isnull(b.id,'~~') 
      

  4.   

    因为你连接条件过滤掉了空值,用isnull替换掉空值情况应该就可以了。
      

  5.   


    我是新手,请问你的on isnull(a.id,'~~') = isnull(b.id,'~~')  这句应该放在哪里呢?
      

  6.   

    inner join v_FullCollectionMembership on (v_FullCollectionMembership.ResourceID = v_R_System_Valid.ResourceID)  
    换掉类似于你这样直接=的句子,因为NULL是不能用=号的
      

  7.   

    --因为内存找不到
    inner join v_GS_X86_PC_MEMORY on (v_GS_X86_PC_MEMORY.ResourceID = v_R_System_Valid.ResourceID)
    --改成
    left join   v_GS_X86_PC_MEMORY on (v_GS_X86_PC_MEMORY.ResourceID = v_R_System_Valid.ResourceID)