有四个表
z_User (User_ID,User_Card,Class_ID,User_Name)
z_Class(ClassID,Class_Name)
z_Door  (Door_ID,Door_Name)
z_Record (User_Card,Door_ID,Record_Event)我想查询中Record_Event,Class_Name,Door_Name,User_Name记录信息
 如果z_User中不包含该 User_Card时   User_Name 和Class_Name名称均为空 如果z_Door 表中Door_ID不存在  则Door_Name也为空请问如何来设置这个sql语句呢!

解决方案 »

  1.   

    select R.Record_Event,c.Class_Name,d.Door_Name,u.User_Name
    from z_Record R left join z_Door D on r.Door_ID=d.Door_ID
    left join z_User U on r.User_Card=u.User_Card
    left join z_Class C on U.ClassID=c.ClassID
    用外连接就OK了
      

  2.   


    select record_event,class_name,door_name,user_name from z_record as d left join z_user as a on a.user_card = d.user_card left join z_door as c on d.door_id = c.door_id join z_class as b on a.class_id = b.classid
      

  3.   

    我觉得既然说如果z_User中不包含该 User_Card时 User_Name 和Class_Name名称均为空  
    应该以它为主表去联之后的几张表
    select U.User_Name, R.Record_Event,C.Class_Name,D.Door_Name
    from z_User u 
             (((left join z_Class C on u.Class_ID = C.Class_ID)
          left join z_Record R on U.R.User_Card = R.User_Card)
          left join  z_Door D on R.Door_ID = D.Door_ID)
    这是SQLSERVER的语法,好长时间没写了,大概这意思,你看看吧
    另外给你介绍下联结 
    例表a 
    aid adate 
    1 a1 
    2 a2 
    3 a3 
    表b 
    bid bdate 
    1 b1 
    2 b2 
    4 b4 
    两个表a,b相连接,要取出id相同的字段 
    select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据. 
    此时的取出的是: 
    1 a1 b1 
    2 a2 b2 
    那么left join 指: 
    select * from a left join b on a.aid = b.bid 
    首先取出a表中所有数据,然后再加上与a,b匹配的的数据 
    此时的取出的是: 
    1 a1 b1 
    2 a2 b2 
    3 a3 空字符 
    同样的也有right join 
    指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 
    此时的取出的是: 
    1 a1 b1 
    2 a2 b2 
    4 空字符 b4 
             
      

  4.   

    回复框的第一排第7个标签
    插入SQL 代码
      

  5.   

    这是我修改过的,
    select U.User_Name, R.Record_Event,
            case U.User_Card when is null then NULL 
                            when is not null then U.User_Name end as username,
     
            case U.User_Card when is null then NULL 
                            when is not null then C.Class_Name end as classname,       D.Door_Name
    from z_User as u  
      (((left join z_Record as R on U.User_Card = R.User_Card)
         left join z_Class as C on u.Class_ID = C.Class_ID )
         left join z_Door as D on R.Door_ID = D.Door_ID)
      

  6.   

    sql.Format("select a.z_CardNumber,a.z_UserName,c.z_ControllerDoorName,b.z_DepartmentClass,a.z_ReadDate,a.z_Event  from z_w_Record as d left join z_w_User as a on d.z_CardNumberHex = a.z_CardNumber left join z_w_Door as c on d.z_DoorID = c.z_DoorID  left join z_w_Class as b on a.z_ClassID = b.z_ClassID  where a.s_Delete=0 and c.s_Delete=0 and b.s_Delete=0   and d.z_ReadDate between '%s' and '%s' order by d.z_ReadDate asc",m_BeginTime,m_EndTime);我是按照这样写的但是ado打开操作就有问题啊!
      

  7.   

    a.s_Delete=0 and c.s_Delete=0 and b.s_Delete=0 //表a,b,c中s_Delete为0and d.z_ReadDate between '%s' and '%s' order by d.z_ReadDate asc"  //时间范围
      

  8.   

    看来你是不相信我呀,你这样写,会把USER里的记录丢掉的,你不是想让它为空吗,又不是没有了, z_w_Record 里有三条记录的话,USER里有二十条的话,你查找后得到的记录肯定是三条。你先一点点找,排查,加括号吧,我以前加括号的,也就是说,第一左联完了的结果,再去联下一个。先把where什么的去掉。