SELECT DISTINCT 
(CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
      THEN dbo.PE_ASS_SumBylastPD.BADGE
      ELSE dbo.PE_ASS_SumByPD.BADGE END) AS BADGE       
FROM dbo.PE_ASS_SumByPD CROSS JOIN
      dbo.PE_ASS_SumByLastPD CROSS JOIN
      dbo.CurrentPD_MinWW  CROSS JOIN
      dbo.Rundate
条件成立(dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww ), 但dbo.PE_ASS_SumBylastPD.BADGE没有显示, 我察看了一下,dbo.PE_ASS_SumByPD表里是空的, 所以请问如何在dbo.PE_ASS_SumByPD表为空的前提下显示dbo.PE_ASS_SumBylastPD.BADGE ???

解决方案 »

  1.   

    是不是這個意思?try
    SELECT DISTINCT 
    (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE
          ELSE IsNull(dbo.PE_ASS_SumByPD.BADGE, dbo.PE_ASS_SumBylastPD.BADGE) END) AS BADGE       
    FROM dbo.PE_ASS_SumByPD CROSS JOIN
          dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate
      

  2.   

    没有相关数据说明,建立楼主先使用
    SELECT *    
    FROM dbo.PE_ASS_SumByPD CROSS JOIN
          dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate
    WHERE dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww --WHERE dbo.CurrentPD_MinWW.minww <> dbo.Rundate.nsww 
    来测试一下数据,是否存在。就可以找出问题的地方。
      

  3.   

    SELECT DISTINCT 
    (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE
          ELSE A.BADGE END) AS BADGE       
    FROM  (SELECT BADGE FROM  dbo.PE_ASS_SumByPD UNION SELECT '1') A CROSS JOIN
          dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate如果表是空的话 ,CROSS JOIN 就连接不出数据,所以要先加一个值
      

  4.   

    如果dbo.PE_ASS_SumByPD表里是空的,那麼CROSS JOIN的話,就是沒有數據的。你應該改用left joinSELECT DISTINCT 
    (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE
          ELSE dbo.PE_ASS_SumByPD.BADGE END) AS BADGE       
    FROM dbo.PE_ASS_SumByPD LEFT JOIN
          dbo.PE_ASS_SumByLastPD ON 關聯條件
         CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate
      

  5.   

    LEFT JOIN也可能有些不合適,lwl0606(寒泉)的方法不錯。這麼處理應該更合適些SELECT DISTINCT 
    (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE
          ELSE IsNull(A.BADGE, dbo.PE_ASS_SumBylastPD.BADGE) END) AS BADGE       
    FROM (SELECT BADGE FROM dbo.PE_ASS_SumByPD UNION SELECT NULL) A CROSS JOIN
          PE_ASS_SumBylastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate
      

  6.   

    我想到一个办法, 在CROSS dbo.PE_ASS_SumByPD时,如果他为NULL,则不把它放进CROSS里去,用CASE写, 但我不知道该怎莫写,谢谢帮忙!
      

  7.   

    declare @sql nvarchar(4000)
    if (select count(*) as aa dbo.PE_ASS_SumByPD)=0
    begin 
    set @sql='SELECT DISTINCT (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE ELSE 0 END) AS BADGE FROM dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN dbo.Rundate'
    end
    else 
    begin 
    set @sql='SELECT DISTINCT (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE  ELSE dbo.PE_ASS_SumByPD.BADGE END) AS BADGE       
    FROM dbo.PE_ASS_SumByPD CROSS JOIN  dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN  dbo.Rundate'
    endexec (@sql)
      

  8.   

    这样把,逻辑是一样的,如果按照你说的用动态查询的话 必须用SQL动态查询
    SELECT DISTINCT 
    (CASE WHEN dbo.CurrentPD_MinWW.minww = dbo.Rundate.nsww 
          THEN dbo.PE_ASS_SumBylastPD.BADGE
          ELSE (select top 1 BADGE from  PE_ASS_SumByPD ) END) AS BADGE       
    FROM  dbo.PE_ASS_SumByLastPD CROSS JOIN
          dbo.CurrentPD_MinWW  CROSS JOIN
          dbo.Rundate