select A.room,A.yd,A.deli,A.state,a.tmp
       ,isnull(B.name,'''') as 'name',B.kind,B.tx,b.outdate
from room_all A
left join man B on A.room=B.room 
where    B.tx='1' and B.name=(select top 1 name 
                from man 
                  where room=B.room 
                     order by charindex(flag,'IROD')
             ) 
      or (B.name is null )

解决方案 »

  1.   

    ----------------------结果/*
    room yd deli state tmp name kind tx outdate
    405 1 标双房 VC 0 谢苹 散客 1 2005-09-20 00:00:00
    9999 1 非住客 VC 0 张三 散客 1 2005-09-20 00:00:00
    */
      

  2.   

    谢谢小样朋友,这个tx ='1' 只不过是个特例,唯一的条件是根据 flag 来判断
    同room 时flag 按 'I','R','O'顺序取,
    比如 有'I'的时候取王五,没有'I'就按'R'的来取,没有'R'就按
    O的来取---如上面的数据同一room的flag 'I' 或者'R' 只有可能出现一条,'O'有可能
    出现多次的)谢谢
      

  3.   

    select A.room,A.yd,A.deli,A.state,a.tmp
           ,isnull(B.name,'''') as 'name',B.kind,B.tx,b.outdate
    from room_all A
    left join man B on A.room=B.room 
    where not exists(select 1 
                        from man 
                            where room=B.room 
                                  and charindex(flag,'IROD')<charindex(B.flag,'IROD'))
          and
          B.name=(select top 1 name 
                    from man 
                      where room=B.room 
                         order by charindex(flag,'IROD')
                 )       or (B.name is null );--结果
    /*
    room       yd   deli       state tmp  name       kind       tx   outdate          
    ---------- ---- ---------- ----- ---- ---------- ---------- ---- -------------------------------
    405        1    标双房        VC    0    谢苹         散客         1    2005-09-20 00:00:00.000
    9999       1    非住客        VC    0    张三         散客         1    2005-09-20 00:00:00.000(2 row(s) affected)
    */
      

  4.   

    select A.room,A.yd,A.deli,A.state,a.tmp
           ,isnull(B.name,'''') as 'name',B.kind,B.tx,b.outdate
    from room_all A
    left join man B on A.room=B.room 
    where B.name=(select top 1 name   -- 这行里的name换成主键
                    from man 
                      where room=B.room 
                         order by charindex(flag,'IROD')
                 ) 
          or (B.name is null );
      

  5.   

    谢谢皱建大哥.您的代码还是有重复哦. name 做不成主键的.请问还有其他办法吗?
      

  6.   

    嗯 ,vivianfdlpw()  大哥您的话很对,不过您的代码好像还是有点问题的.
      

  7.   

    我把问题简单化一下.只有一个表
    希望按flag  'I','R','O'顺序取,
    比如 有'I'的时候取王五,没有'I'就按'R'的来取,没有'R'就按
    O的来取---如上面的数据同一room的flag 'I' 或者'R' 只有可能出现一条,'O'有可能
    出现多次的)
    create table man (room char(10),name char(10),kind char(10),tx char(1),outdate datetime,flag char(1));
    insert into man values('405','王五','散客','1','2005-09-20','I');
    insert into man values('405','谢苹','散客','1','2005-09-20','R');
    insert into man values('9999','张三','散客','1','2005-09-20','I');
    insert into man values('9999','张三','团队','0','2005-09-22','R');
    insert into man values('9999','李强','自用','0','2005-09-12','O');
    insert into man values('9999','赵丽','半天','1','2004-09-12','O');请教这个sql怎么写?谢谢
      

  8.   

    我把问题简单化一下.只有一个表
    希望按flag  'I','R','O'顺序取,
    比如 有'I'的时候取王五,没有'I'就按'R'的来取,没有'R'就按
    O的来取---如上面的数据同一room的flag 'I' 或者'R' 只有可能出现一条,'O'有可能
    出现多次的)
    create table man (room char(10),name char(10),kind char(10),tx char(1),outdate datetime,flag char(1));
    insert into man values('405','王五','散客','1','2005-09-20','I');
    insert into man values('405','谢苹','散客','1','2005-09-20','R');
    insert into man values('9999','张三','散客','1','2005-09-20','I');
    insert into man values('9999','张三','团队','0','2005-09-22','R');
    insert into man values('9999','李强','自用','0','2005-09-12','O');
    insert into man values('9999','赵丽','半天','1','2004-09-12','O');希望得到结果行为
    ('405','王五','散客','1','2005-09-20','I');
    ('9999','张三','散客','1','2005-09-20','I');请教这个sql怎么写?谢谢
      

  9.   

    這個問題的關鍵就是如何寫一個判斷把 flag=R 的那條張三的記錄排除掉.
    之所以會重複是因為有 where room=B.room 這個條件.但如果沒有這個條件,記錄又有遺失.
    我想了好久, 但是還沒想出來.