功能是:查询出所有的记录,根据tbUser_Name得知用户是否收藏过这条记录,收藏过就将Flag=1,没有收藏过就将 flag=0 
      ID         name       MSG           tbUser_Username
  20130405bAA     李        欣赏ffff          weiwei
  20130405bAA     李        欣赏ffff          latlong
  20130405bAB     李        你好              Null
  20130405bAC     李        收到了          latlong
  20130405bAD     李        可以关闭了        Null【注】:
    上面是个视图,是由两个表组成的。
我要查询tbUser_Username='weiwei'的,查询出的结果    
      ID         name       MSG               Flag
  20130405bAA     李        欣赏ffff           1
  20130405bAB     李        你好               0
  20130405bAC     李        收到了             0
  20130405bAD     李        可以关闭了         0
 这条记录因为weiwei没有收藏过,所以就将flag=0,  => 20130405bAC     李        收到了          latlong

解决方案 »

  1.   

    SELECT ID, name, MSG,
        CASE  tbUser_Username WHEN 'weiwei' THEN 1 ELSE 0 END AS Flag
    FROM 视图
      

  2.   

    基本如下:
    with tb as
    (
    select distinct  ID, name, MSG
    from table
    )
    select tb.*, case WHEN table.ID IS NOT NULL THEN 1 ELSE 0 END as Flag
    from tb
    left outer join table on table.ID = tb.ID
    and  table.tbUser_Username = 'weiwei'
      

  3.   

    表tbMessage
     ID             name         MSG 
     20130405bAA     李        欣赏ffff          
     20130405bAB     李        你好           
     20130405bAC     李        收到了         
     20130405bAD     李        可以关闭了     
       
    表tbFav
     tbUser_Username        tbMessage_ID
         weiwei             20130405bAA 
        latlong             20130405bAA
        latlong             20130405bAC 
    上面两个表。   查weiwei 时, 一定要把20130405bAC 这条记录查出来,将flag标记为0   意思是没收藏的标记为0  ,收藏了的标记为1   
      

  4.   


    SELECT ID, name, MSG,
        CASE  tbUser_Username WHEN 'weiwei' THEN 1 ELSE 0 END AS Flag
    FROM 视图
    这样写就会出现重复记录。  
       20130405bAA     李        欣赏ffff          flag=1
      20130405bAA     李        欣赏ffff           flag=0这两条记录我只要flag=1 的。
      

  5.   

    最终查询weiwei出的结果为: ID             name         MSG         flag
     20130405bAA     李        欣赏ffff       1
     20130405bAB     李        你好           0
     20130405bAC     李        收到了         0
     20130405bAD     李        可以关闭了     0查询atlong  结果为
     ID             name         MSG         flag
     20130405bAA     李        欣赏ffff       1
     20130405bAB     李        你好           0
     20130405bAC     李        收到了         1
     20130405bAD     李        可以关闭了     0查询 XXX  结果为
     ID             name         MSG         flag
     20130405bAA     李        欣赏ffff       0
     20130405bAB     李        你好           0
     20130405bAC     李        收到了         0
     20130405bAD     李        可以关闭了     0
      

  6.   

    嗯,你可以这样。DECLARE @tbMessage TABLE
        (
          Id CHAR(11) ,
          Name VARCHAR(50) ,
          Msg VARCHAR(50)
        );
       
    INSERT  INTO @tbMessage
            ( Id, Name, Msg )
    VALUES  ( '20130405bAA', '李', '欣赏ffff' ),
            ( '20130405bAB', '李', '你好' ),
            ( '20130405bAC', '李', '收到了' ),
            ( '20130405bAD', '李', '可以关闭了' );
            
    DECLARE @tbFav TABLE
        (
          tbUser_Username VARCHAR(50) ,
          tbMessage_ID CHAR(11)
        );INSERT  INTO @tbFav
            ( tbUser_Username, tbMessage_ID )
    VALUES  ( 'weiwei', '20130405bAA' ),
            ( 'latlong', '20130405bAA' ),
            ( 'latlong', '20130405bAC' );DECLARE @UserName VARCHAR(50);
    SET @UserName = 'weiwei';SELECT  m.* ,
            CASE WHEN t.tbMessage_ID IS NULL THEN 0
                 ELSE 1
            END
    FROM    @tbMessage m
            OUTER APPLY ( SELECT TOP 1
                                    *
                          FROM      @tbFav f
                          WHERE     m.id = f.tbMessage_ID
                                    AND tbUser_Username = @UserName
                        ) AS t;
      

  7.   

    SELECT a.ID, a.name, a.MSG,
        (CASE WHEN EXISTS(SELECT 1 FROM #tbFav WHERE ID=a.ID AND tbUser_Username='weiwei') THEN 1 ELSE 0 END) Flag
    FROM #tbMessage a
      

  8.   

    楼上的方法更有通用性。
    只是,where条件有点小问题SELECT  a.* ,
            ( CASE WHEN EXISTS ( SELECT 1
                                 FROM   @tbFav
                                 WHERE  tbMessage_ID = a.Id
                                        AND tbUser_Username = @UserName ) THEN 1
                   ELSE 0
              END ) Flag
    FROM    @tbMessage a
      

  9.   

    上面的方法虽然可行,但数据量大的情况下可能有效率问题。看下面这个SELECT a.ID, a.name, a.MSG, ISNULL(b.Flag, 0)
    FROM tbMessage a LEFT JOIN
        (SELECT ID, 1 AS Flag FROM tbFav
         WHERE tbUser_Username='weiwei'
        ) b ON a.ID=b.ID
      

  10.   


    select ID,name,msg,flag=case when tbuser_username='weiwei' then 1 else 0 end
    from tbmessage left join tbfav
    on tbmessage.id=tbfav.tbmessage_id and tbuser_username='weiwei'
      

  11.   

    嗯,如果在一定会带有名称的情况下,那么11楼这种写法很好。
    但是,如果我们也希望不带上tbUser_Username,而只是简单地查找这条记录是否被收藏过,这种写法会产生多出来的记录。
      

  12.   

    谢谢各位, 效果已经实现了 。这个语句可不可以作成视图, 以传参数的形式。  因为我还要使用sql存储过程函数进行分页显示。tbuser_username  不一定是要查询哪一个用户的。
      

  13.   

    超级无敌笨的方法,实在想不到更好的了
    select id,name,msg,max(count) flag from (
    select *,1 count from tbUser where username='weiwei' group by id
    union all
    select *,0 count from tbUser
    ) t group by id;
      

  14.   

    参考1楼的就简洁多了,我这都没想到
    SELECT ID, name, MSG,
    max(CASE  username WHEN 'weiwei' THEN 1 ELSE 0 END) AS Flag
    FROM tbUser GROUP BY ID;
      

  15.   

    问题解决,谢谢各位。。   使用  with as   写的存储过程 结贴