sqlserver去重查询数据

ak520ak 2017-10-11 11:41:38
例如 数据为 表 a
id name
1 张三
1 李四
2 张三
2 李四
这里id不唯一
求查出 结果为
id name
1 张三
2 李四
我有个查询是
select id,max(name)as name from a group by id
但我要的不是根据max(name),而是随机查出来的要怎么写呢
另外还想要将两个相同id 的name 合并到一条 效果为
id name name1
1 张三 张三
2 李四 李四
这个sql要怎么写呢?
...全文
3146 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
第二个 sql的完整需求是这样的 id name 1 张三 1 李四 2 王五 2 赵六 3 钱七 结果是 id name1 name2 1 张三 李四 2 王五 赵六 3 钱七 (为空)
二月十六 2017-10-12
  • 打赏
  • 举报
回复
引用 18 楼 ak520ak 的回复:
感谢版主大佬的指导!!!顺便问一下,大佬推荐看什么书来学习sql呢?
看看这个的答案 http://bbs.csdn.net/topics/392272525 另外记得结贴哦
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
感谢版主大佬的指导!!!顺便问一下,大佬推荐看什么书来学习sql呢?
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
查询结果是 查询到了 b表的 id name 1 一,二,三 这一条 还有 第二个sql语句,不重复的 id name 1 张三 1 张三 2 李四 2 李四 3 王五 结果是 id name1 name2 1 张三 张三 2 李四 李四 3 王五 (为空)
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 8 楼 ak520ak 的回复:] 还有个sql语句的问题 查询表b中包含表a的列的查询 a id name 1 一 2 二 b id name 1 一,二,三 怎样查询b.name中包含表a所有的name呢? 我这里是这样写的 select b.id, from a right join b on b.name like '%'+a.name+'%' group by b.id having count(*) =(select count(*) from a) 这个并不能实现我的需求,请问要怎么改呢
这个想要什么结果?[/quote] 这个就是要查出表b中包含所有表a.name的数据
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
哦,仔细看了一下,原来上面的是创建表。。。
二月十六 2017-10-12
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(22))
Insert #a
select 1,N'张三' union all
select 1,N'李四' union all
select 2,N'王五' union all
select 2,N'赵六' union all
select 3,N'钱七'
Go
--测试数据结束
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY id ORDER BY GETDATE()) AS num FROM #a
)
SELECT a.id,a.name,b.name AS name1
FROM cte a
LEFT JOIN cte b ON b.id = a.id
AND b.num = 2
WHERE a.num = 1


ak520ak 2017-10-12
  • 打赏
  • 举报
回复
还有个sql语句的问题 查询表b中包含表a的列的查询 a id name 1 一 2 二 b id name 1 一,二,三 怎样查询b.name中包含表a所有的name呢? 我这里是这样写的 select b.id, from a right join b on b.name like '%'+a.name+'%' group by b.id having count(*) =(select count(*) from a) 这个并不能实现我的需求,请问要怎么改呢
二月十六 2017-10-12
  • 打赏
  • 举报
回复
1、
--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(21))
Insert #a
select 1,N'一' union all
select 2,N'二'
GO
if not object_id(N'Tempdb..#b') is null
drop table #b
Go
Create table #b([id] int,[name] nvarchar(25))
Insert #b
select 1,N'一,二,三' union all
select 2,N'二' --这里添加了一条测试数据,不满足条件的数据,不会搜索出来
Go
--测试数据结束
SELECT *
FROM #b
WHERE ( SELECT COUNT(1)
FROM #a
WHERE CHARINDEX(',' + #a.name + ',', ',' + #b.name + ',') > 0
) = ( SELECT COUNT(1)
FROM #a
)





2、
--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(22))
Insert #a
select 1,N'张三' union all
select 1,N'张三' union all
select 2,N'李四' union all
select 2,N'李四' union all
select 3,N'王五'
Go
--测试数据结束
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY id ORDER BY GETDATE()) AS num FROM #a
)
SELECT a.id,a.name,b.name AS name1
FROM cte a
LEFT JOIN cte b ON b.id = a.id
AND b.num = 2
WHERE a.num = 1


ak520ak 2017-10-12
  • 打赏
  • 举报
回复
我的意思是说,这里的select 1 1 2 2是不是每条都要查询查询过去union all呢 而不是一次性查询整张表
二月十六 2017-10-12
  • 打赏
  • 举报
回复
引用 12 楼 ak520ak 的回复:
[quote=引用 10 楼 sinat_28984567 的回复:] [quote=引用 8 楼 ak520ak 的回复:] 还有个sql语句的问题 查询表b中包含表a的列的查询 a id name 1 一 2 二 b id name 1 一,二,三 怎样查询b.name中包含表a所有的name呢? 我这里是这样写的 select b.id, from a right join b on b.name like '%'+a.name+'%' group by b.id having count(*) =(select count(*) from a) 这个并不能实现我的需求,请问要怎么改呢
这个想要什么结果?[/quote] 这个就是要查出表b中包含所有表a.name的数据[/quote] 查询结果是什么?是 id name 1 一,2 这样的结果?
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
1.就name和name1 2.很多行 这里的select 1,N'张三' union all ... 要的是整个表,而不是单纯的就这几行
二月十六 2017-10-12
  • 打赏
  • 举报
回复
1、name 的数量不定是吗?就是可能到namen? 2、很多行有问题吗?
二月十六 2017-10-12
  • 打赏
  • 举报
回复
引用 8 楼 ak520ak 的回复:
还有个sql语句的问题 查询表b中包含表a的列的查询 a id name 1 一 2 二 b id name 1 一,二,三 怎样查询b.name中包含表a所有的name呢? 我这里是这样写的 select b.id, from a right join b on b.name like '%'+a.name+'%' group by b.id having count(*) =(select count(*) from a) 这个并不能实现我的需求,请问要怎么改呢
这个想要什么结果?
二月十六 2017-10-12
  • 打赏
  • 举报
回复
引用 7 楼 ak520ak 的回复:
我的意思是说,这里的select 1 1 2 2是不是每条都要查询查询过去union all呢 而不是一次性查询整张表
就是直接查询整张表,刚才说了union all的是测试数据,不是真正的表,你换成你自己的表名就行了,直接执行测试数据下边的select语句,这个语句,把#a这两个字符换成你自己的表名
SELECT  t.id ,
        ( SELECT TOP 1
                    name
          FROM      #a
          WHERE     t.id = id
          ORDER BY  name
        ) AS name1 ,
        ( SELECT TOP 1
                    name
          FROM      #a
          WHERE     t.id = id
          ORDER BY  name DESC
        ) AS name2
FROM    ( SELECT DISTINCT
                    id
          FROM      #a
        ) t
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
而且,第一个我只是实例里面有这么几行数据,其实数据不止这些的
ak520ak 2017-10-12
  • 打赏
  • 举报
回复
第二个不是整合成一个,name,是变成name和name1这样的两个字段
二月十六 2017-10-12
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(22))
Insert #a
select 1,N'张三' union all
select 1,N'李四' union all
select 2,N'张三' union all
select 2,N'李四'
Go
--测试数据结束
SELECT t.id ,
( SELECT TOP 1
name
FROM #a
WHERE t.id = id
ORDER BY NEWID()
) AS name
FROM ( SELECT DISTINCT
id
FROM #a
) t




--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(22))
Insert #a
select 1,N'张三' union all
select 1,N'李四' union all
select 2,N'张三' union all
select 2,N'李四'
Go
--测试数据结束
SELECT id ,
STUFF(( SELECT ',' + name
FROM #a
WHERE id = a.id
FOR
XML PATH('')
), 1, 1, '') AS name
FROM #a AS a
GROUP BY id


二月十六 2017-10-12
  • 打赏
  • 举报
回复
1、
--测试数据
if not object_id(N'Tempdb..#a') is null
drop table #a
Go
Create table #a([id] int,[name] nvarchar(22))
Insert #a
select 1,N'张三' union all
select 1,N'李四' union all
select 2,N'张三' union all
select 2,N'李四'
Go
--测试数据结束
SELECT t.id ,
( SELECT TOP 1
name
FROM #a
WHERE t.id = id
ORDER BY name
) AS name1 ,
( SELECT TOP 1
name
FROM #a
WHERE t.id = id
ORDER BY name DESC
) AS name2
FROM ( SELECT DISTINCT
id
FROM #a
) t




2、那个union all的是测试数据、测试数据,换成楼主自己的表名就行了

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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