求一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
...全文
382 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 视图
内容概要:本文研究了基于共识的捆绑算法(CBBA)在多智能体系统中的多任务分配问题,重点应用于远程太空船交会与维修的相对运动规划(RPO)任务。通过Matlab代码实现了CBBA算法,解决了多个航天器在复杂空间环境下协同执行交会、对接与维修任务时的任务分配挑战。研究突出该算法在分布式决策、冲突避免与资源优化方面的优势,详细探讨了任务打包、竞标机制与共识达成等核心环节,验证了其在无中央控制器条件下实现高效、鲁棒任务分配的有效性。; 适合人群:具备航天动力学、控制理论、多智能体系统及优化算法基础,从事航天器自主任务规划、分布式协同控制等相关领域的研究生、科研人员及工程师。; 使用场景及目标:① 实现多航天器在通信受限与信息不完整的远程空间环境下的自主任务分配;② 提升RPO任务中路径规划与资源调度的效率与安全性;③ 构建去中心化的多智能体协同框架,增强系统整体鲁棒性与可扩展性。; 阅读建议:建议结合提供的Matlab代码深入理解CBBA算法的实现逻辑,重点关注竞标权重设计、任务冲突消解与共识收敛过程,并可通过调整任务规模、通信拓扑与约束条件进行仿真实验,以全面掌握算法性能与适用边界。

34,876

社区成员

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

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