问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql 怎么查询多个列并对其中某列去重复

发布网友 发布时间:2022-04-09 15:46

我来回答

2个回答

懂视网 时间:2022-04-09 20:07

* from (select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u left join BASE_USERROLE ur on u.USERID=ur.USER_ID left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID) t for XML path

 

查出表的XML文件的组成

 想想看如果我们可以替换XML文件的组成的话我们是不是就可以改变表的结构了

我们先看一个简单的表,多行的重复是怎么合并的

select * from table1

查询结果:

技术分享

看看这样的一个简单的表我们是怎样合并相同的列的

第一步:当然是查看表的XML文件看看表是怎样组成的

select * from table1 for XML path;

查询的结果:

<row>
 <uid>1</uid>
 <rname>管理员</rname>
</row>
<row>
 <uid>1</uid>
 <rname>店主</rname>
</row>
<row>
 <uid>1</uid>
 <rname>买家</rname>
</row>
<row>
 <uid>2</uid>
 <rname>店主</rname>
</row>
<row>
 <uid>2</uid>
 <rname>店主</rname>
</row>

 根据查询的结果我们不难看出表的组成的简单结构,可能是数据库自己定义好的也可能是我们在查询的时候自动生成的,不管是定义好的还是自己生成的我们先看看是否可以改变表的组成结构如果可以的话我们是不是就可以改变我们想要的结构呢?

第二步:改变表的组成结构

select * from table1 for XML path;

还是这句语句既然可以查询表的XML文件组成那是否可以改变表的XML文件的组成呢。试试就知道了(程序就是你想的再多不如你敲几行代码一试)

select * from table1 for XML path(‘a‘);

我们这样写语句看看我们的表的XML文件的组成变成了什么样:

<a>
 <uid>1</uid>
 <rname>管理员</rname>
</a>
<a>
 <uid>1</uid>
 <rname>店主</rname>
</a>
<a>
 <uid>1</uid>
 <rname>买家</rname>
</a>
<a>
 <uid>2</uid>
 <rname>店主</rname>
</a>
<a>
 <uid>2</uid>
 <rname>店主</rname>
</a>

比较两次的查询结果看看我们的表的XML文件发生了什么变化:

select * from table1 for XML path;

XML文件:
<row>
 <uid>1</uid>
 <rname>管理员</rname>
</row>

select * from table1 for XML path(‘a‘);

XML文件的组成:
<a>
 <uid>1</uid>
 <rname>管理员</rname>
</a>

可以产出<row>标签变成了<a>,那么我们把path(‘a‘)中的a去掉会变成什么样:

查询语句:
select * from table1 for XML path(‘‘);
查询结果:
<uid>1</uid>
<rname>管理员</rname>
<uid>1</uid>
<rname>店主</rname>
<uid>1</uid>
<rname>买家</rname>
<uid>2</uid>
<rname>店主</rname>
<uid>2</uid>
<rname>店主</rname>

比较两次的查询结果:

select * from table1 for XML path(‘a‘);
查询结果:
<a>
 <uid>1</uid>
 <rname>管理员</rname>
</a>

select * from table1 for XML path(‘‘);
查询结果:
<uid>1</uid>
<rname>管理员</rname>

可以看出<a>去掉了,我们想要的是什么是用户的角色那我们就要角色看看:

第三步:去掉多余的行

select rname from table1 for XML path(‘‘);
查询的结果:
<rname>管理员</rname>
<rname>店主</rname>
<rname>买家</rname>
<rname>店主</rname>
<rname>店主</rname>

当然这仍然不是我们想要的结果我们想要的里面的数据,所以我们需要去掉<rname>标签:

第四步:去掉不要的标签:

select rname+‘,‘ from table1 for XML path(‘‘);
查询的结果:
管理员,店主,买家,店主,店主,

这就是我们想要的结果了,结果是拿到了但是我们想要的是什么效果啊,先看看我们们想要的表是什么样的

技术分享

这是我们想要的表,但是怎么组成呢?

再看看我们原来的表:

技术分享

想想看我们应该把这张表变形:

uid是多行的那我们就先不看rname这一列,我们先进行分组:

第五步:分组

根据uId进行分组

select uid from table1 group by uid

结果:

技术分享

好,最重要的一步来了:

我们怎么把管理员,店主,买家,放在对应uid为1的一行,怎么把店主,店主,放在对应的uid为2的一行后面

第六步:合并:

也就是在这个表的后面添加一列。这样就简单了

select uid,(这一列就是rname)from table1 t group by uid;

那我们就增加一列:

上面我们的查询时查询所有的列现在我们加上条件:

select rname+‘,‘ from table1 t1 where t1.uid=1 for XML path(‘‘);


查询结果:

管理员,店主,买家,

这不就是我们想要的嘛,只要把条件改变一下就可以了嘛,现在我们进行合并也就是增加一列。

select uid,(这一列就是rname)from table1 t group by uid;
增加rname这一列:
select uid,(select rname+‘,‘ from table1 t1 where t1.uid=t.uid for XML path(‘‘)) as rname from table1 t group by uid;

我们看看这个语句的查询结果是什么?

select uid,(select rname+‘,‘ from table1 t1 where t1.uid=t.uid for XML path(‘‘)) as rolenames from table1 t group by uid;

结果:

技术分享

这就是我们想要的结果了。

好了简单表的组成会了我们来点复杂的

继续完成我们刚开始提出的问题:

合成这张表试试看

查询语句:

select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u left join BASE_USERROLE ur on u.USERID=ur.USER_ID 
left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID

技术分享

我们该怎么合并这张表呢。仔细想想看其实道理是一样的我们直接把这张表当让是table1表,在往刚刚的sql语句一套不就行了

看看刚才的sql语句:

select uid,(select rname+‘,‘ from table1 t1 where t1.uid=t.uid for XML path(‘‘)) as rolenames from table1 t group by uid;


看看哪里用到了table1我们改变一下就行了
select uid,(select rname+‘,‘ from (table1表) t1 where t1.uid=t.uid for XML path(‘‘)) as rolenames from (table1表) t group by uid;

再根据我们的表看一看也就是改变一下查询的列的问题:

我们改变一下

select USERID,(select t.ROLE_NAME+‘,‘ from (table1表))t where t.USERID=t1.USERID for XML path(‘‘)) as RoleName from(table1表)t1 group by USERID,TrueName,USERNAME

好了把我们的“table1表”放进去,执行一下看看什么结果

select USERID,(select t.ROLE_NAME+‘,‘ from 
(select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u 
left join BASE_USERROLE ur on u.USERID=ur.USER_ID 
left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID) t where t.USERID=t1.USERID for XML path(‘‘)) as RoleName from
(select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u 
left join BASE_USERROLE ur on u.USERID=ur.USER_ID 
left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID) t1 group by USERID

查询结果:

技术分享

可是跟上面的表比较一下我们的表少了几列所以我们要把少的几列加上:

select USERID,TrueName,USERNAME,(select t.ROLE_NAME+‘,‘ from 
(select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u 
left join BASE_USERROLE ur on u.USERID=ur.USER_ID 
left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID) t where t.USERID=t1.USERID for XML path(‘‘)) as RoleName from
(select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u 
left join BASE_USERROLE ur on u.USERID=ur.USER_ID 
left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID) t1 group by USERID,TrueName,USERNAME

看看查询的结果是不是我们想要的

技术分享

在这里一定要注意一下group by 后面的语句,虽然我们写那么多的分组条件就只是第一个条件及作用我们仍然要写因为只有这样我们在查询的时候才可以去查询想要的列。

所以当你想要的查询其他的列的时候你就需要在group by 后面加上此列。

 

sql多行多列重复

标签:显示   _id   分组   技术分享   ack   变化   数值   效率   复杂   

热心网友 时间:2022-04-09 17:15

这样肯定不行啊,因为数据库无法判断你要去掉哪条重复的。
比如你想要a只显示一条,但是相对于a的col1里面有三个不同的值,数据库是无法给你判断的。
这个时候就要看你想要什么样的值了,假如我想要每个人的最低分科目
select t.col2, min(t.col1) from t_table t
group by t.col2
having min(t.col1) > '-1'
一个简单的分组就搞定了。
用sqlserver的时候会有点小问题。可以考虑嵌套查询:
例如
select * from table1
where id in (select id from table1
group by name)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何批量导出全部微信好友微信号?快速导出微信联系人 交强险什么价格 命运冠位指定必练五星英灵是什么 命运冠位指定必练五星英灵推荐 自制豆沙馅能保存多久 红豆沙馅怎么保存 我高三,从现在到高考分数从350提到500多,有可能吗?我是文科生 高三350分还有5个月能提多少分 文科复读350多分可以提高多少 钱钟书-谈艺录-读本目录 送茶叶都有什么讲究呢? 中国文化送礼茶叶有什么讲究茶叶送礼有什么讲究和注意事项 怎样去日本上大学 什么是 明装水龙头 梦见我在吃面条老太太往我碗中放了半碗水? 本人今年15岁 想问问到日本留学需要什么条件?求指点。在去日本之前是要先会日语才可以去日本么, 本人今年15岁,打算学习4年去日本留学。在此我想向大家问一些问题请好心人回答我谢谢!详细回答哟 浴室入墙式冷热水龙头是暗装的但是买了个明装该怎么装 你好,我们公司一台佳能IR2525I复印机打印的速度很慢,是怎么回事? 15岁的孩子能去日本留学么 佛滔算命梦到碗里有面条 梦见碗里的面条都沾一起了 佳能复印机2020G怎样建局网 请问佳能2520i设置网络打印,单独和电脑连的话可以,用公司的内网就连不上,为什么? 梦见吃面时别人往我碗里倒好多鸡精是为什么? 浴室冲凉花洒是买明装好还是暗装的好? 梦见一个女的给我送了一大碗面条 粳米 的 &quot;粳&quot; 怎么发音? 粳米的读音 粳怎么读 本科毕业论文在其他学校做,指导老师该写谁的名字? 成人本科论文指导老师写谁 牛油果酸奶沙拉酱怎么做 怎么做酸奶酱 求教佳能打印机硒鼓怎么加墨 房屋产权人是否可以是两人 佳能打印机怎么设置出墨量 共有产权是夫妻共有的意思么 你所申请的登记房屋及非房屋类物权是否共有,怎么理解? 房屋产权是否为共同财产? 如何判断房屋产权是否共有?如果是共有产权在二手房交易时如何处理... 什么是共有产权人?办理房屋共有权证要满足什么条件? 房产证上的家庭成员算是产权共有人吗 视频编辑电脑配置要求 什么是共有房产?什么是房屋产权共有人? 视频编辑对电脑配置的要求: 三星手机应用怎么卸载? sql多行数据只有一列会存在重复,怎么保留多行的前提下,某列重复值只保留一个,其余的全部为空? 我是苹果手机 为什么不能上yy iphone6 plus 玩不了YY了 登录YY显示当前网络不可用 设置里面没有YY的数据 为什么苹果6手机下载不了yy,也删不掉yy就一个灰色的图标在手机上? 我用的6s 想看yy直播 可是一点yy 手机就黑屏重新启动啦 怎么会这样