大家帮帮忙啊。。。。。。。。明早结贴.................

暴走的车轮 2010-08-17 02:35:20
数据库结构
id name1 name2 ......

现在我要筛选出如下记录

比如数据
1 张三 李四
2 张三 李四
3 李四 王五
4 李四 赵六
5 张三 王五
6 李四 赵六

我需要的数据如下
2 张三 李四
3 李四 王五
5 张三 王五
6 李四 赵六


也就是说我要查找如果name1 和 name2 在数据库里存在都对应相等的记录,就选择ID最大的那个出来,如果没有对应相等的就直接读出来就好了。就是去掉name1 和name2 对应相等的重复记录......

不知道表达明白没有?各位帮帮,我SQL菜鸟!!
...全文
76 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
windfeel2008 2010-08-17
  • 打赏
  • 举报
回复

Create Table #TB(ID Int,Name1 VarChar(10),Name2 VarChar(10))
Insert #TB Select 1,'张三','李四'
Union All Select 2,'张三','李四'
Union All Select 3,'李四','王五'
Union All Select 4,'李四','赵六'
Union All Select 5,'张三','王五'
Union All Select 6,'李四','赵六'

Select Max(ID) AS ID,Name1,Name2 from #TB Group by Name1,Name2
/*
ID Name1 Name2
----------- ---------- ----------
2 张三 李四
3 李四 王五
5 张三 王五
6 李四 赵六

(所影响的行数为 4 行)
*/
fengyun142415 2010-08-17
  • 打赏
  • 举报
回复

select * from tb
where id not in (select min(a.id)
from tb a,tb b
where a.id!=b.id and a.name1=b.name1 and a.name2=b.name2
group by a.name1,a.name2)
ws_hgo 2010-08-17
  • 打赏
  • 举报
回复
if not object_id('tb') is null
drop table tb
Go
Create table tb([ID] int,[name1] nvarchar(2),[name2] nvarchar(2))
Insert tb
select 1,N'张三',N'李四' union all
select 2,N'张三',N'李四' union all
select 3,N'李四',N'王五' union all
select 4,N'李四',N'赵六' union all
select 5,N'张三',N'王五' union all
select 6,N'李四',N'赵六'
Go

select * from
(
select *,
(select count(*)+1 from tb where [ID]>T.[ID] and [name1]=T.[name1] and [name2]=T.[name2]) rank
from tb t
)tt
where rank=1

ID name1 name2 rank
----------- ----- ----- -----------
2 张三 李四 1
3 李四 王五 1
5 张三 王五 1
6 李四 赵六 1

(4 行受影响)
水族杰纶 2010-08-17
  • 打赏
  • 举报
回复
--> --> (wufeng4552)生成測試數據

if not object_id('tb') is null
drop table tb
Go
Create table tb([ID] int,[name1] nvarchar(2),[name2] nvarchar(2))
Insert tb
select 1,N'张三',N'李四' union all
select 2,N'张三',N'李四' union all
select 3,N'李四',N'王五' union all
select 4,N'李四',N'赵六' union all
select 5,N'张三',N'王五' union all
select 6,N'李四',N'赵六'
Go
;with tt
as
(select px=row_number()over(partition by name1,name2 order by id desc),
* from tb)
select ID,
name1,
name2
from tt where px=1 order by id
/*
ID name1 name2
----------- ----- -----
2 张三 李四
3 李四 王五
5 张三 王五
6 李四 赵六

(4 個資料列受到影響)
*/
SQLCenter 2010-08-17
  • 打赏
  • 举报
回复
#2 效率应该高点
暴走的车轮 2010-08-17
  • 打赏
  • 举报
回复
楼上的两种写法都可以满足要求 请问下哪种效率高一些呢?
hantaozuvip 2010-08-17
  • 打赏
  • 举报
回复
学习学习~~~
  • 打赏
  • 举报
回复
此问题的关键在于两个技术的应用:
1、子查询的使用;
2、exists的使用;
由于需求中有一个相同记录取id较大的数据要求,所以采用了id自比较的处理。
此问题经常用于,过滤id不同、产生时间不同等存在大小关系的字段,而其他字段相等的过滤问题上。
  • 打赏
  • 举报
回复
create table tab(id int,name1 varchar(10),name2 varchar(10))
insert tab
select 1,'张三','李四' union all
select 2,'张三','李四' union all
select 3,'李四','王五' union all
select 4,'李四','赵六' union all
select 5,'张三','王五' union all
select 6,'李四','赵六'

select *
from tab T1
where not exists (select 1 from tab T2 where T2.name1=T1.name1 and T2.name2=T1.name2 and T1.id<T2.id)

drop table tab


(6 row(s) affected)
id name1 name2
----------- ---------- ----------
2 张三 李四
3 李四 王五
5 张三 王五
6 李四 赵六

(4 row(s) affected)

brownhwy 2010-08-17
  • 打赏
  • 举报
回复

Select a.id,a.name1,a.name2 From tb a Where a.id= (Select max(id) From tb b Where a.name1=b.name1 And a.name2=b.name2 )

34,593

社区成员

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

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