求一sql语句

zywhao 2013-04-16 04:05:33
功能是:查询出所有的记录,根据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
...全文
342 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zywhao 2013-04-18
  • 打赏
  • 举报
回复
问题解决,谢谢各位。。 使用 with as 写的存储过程 结贴
pcmlose 2013-04-17
  • 打赏
  • 举报
回复
参考1楼的就简洁多了,我这都没想到
SELECT ID, name, MSG,
max(CASE  username WHEN 'weiwei' THEN 1 ELSE 0 END) AS Flag
FROM tbUser GROUP BY ID;
pcmlose 2013-04-17
  • 打赏
  • 举报
回复
超级无敌笨的方法,实在想不到更好的了
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;
zywhao 2013-04-17
  • 打赏
  • 举报
回复
谢谢各位, 效果已经实现了 。 这个语句可不可以作成视图, 以传参数的形式。 因为我还要使用sql存储过程函数进行分页显示。 tbuser_username 不一定是要查询哪一个用户的。
连星入剑端 2013-04-16
  • 打赏
  • 举报
回复
嗯,如果在一定会带有名称的情况下,那么11楼这种写法很好。 但是,如果我们也希望不带上tbUser_Username,而只是简单地查找这条记录是否被收藏过,这种写法会产生多出来的记录。
习惯性蹭分 2013-04-16
  • 打赏
  • 举报
回复

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'
在路上_- 2013-04-16
  • 打赏
  • 举报
回复
上面的方法虽然可行,但数据量大的情况下可能有效率问题。看下面这个

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
连星入剑端 2013-04-16
  • 打赏
  • 举报
回复
楼上的方法更有通用性。 只是,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
在路上_- 2013-04-16
  • 打赏
  • 举报
回复
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
连星入剑端 2013-04-16
  • 打赏
  • 举报
回复
嗯,你可以这样。

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;
zywhao 2013-04-16
  • 打赏
  • 举报
回复
最终查询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
zywhao 2013-04-16
  • 打赏
  • 举报
回复

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 的。
zywhao 2013-04-16
  • 打赏
  • 举报
回复
表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
小猴168 2013-04-16
  • 打赏
  • 举报
回复
1楼+1
shoppo0505 2013-04-16
  • 打赏
  • 举报
回复
基本如下: 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'
小怪兽程序猿 2013-04-16
  • 打赏
  • 举报
回复
视图示俩表组成的,俩表呢?表名呢?
在路上_- 2013-04-16
  • 打赏
  • 举报
回复
SELECT ID, name, MSG,
    CASE  tbUser_Username WHEN 'weiwei' THEN 1 ELSE 0 END AS Flag
FROM 视图

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧