当前位置:编程学习 > C#/ASP.NET >>

关于SQL 的一个问题!!!! 谢谢了



RecipientNo是我要发私信的对象,有些是重复的名字 请问该如何去掉...

select  *  from sc_privateletter order by LetterDate desc --------------------编程问答-------------------- 重复的名字,但是发送的内容不同啊,去掉什么?说清楚点。 --------------------编程问答-------------------- RecipientNo中若名字相同 则只查询出最新的那一条

--------------------编程问答-------------------- id b

1 5
2 6
3 7
4 5
5 7

现在要删除b中的重复内容,只保留一条数据

得到结果
  
id b

1 5
2 6
3 7 --------------------编程问答-------------------- 解决:需要的同志可以参考下
select * from 表名 where LetterID in (select min(LetterID ) from 表名  group by RecipientNo) order by Letterdate desc   --------------------编程问答--------------------
引用 4 楼 hrxqc 的回复:
解决:需要的同志可以参考下
select * from 表名 where LetterID in (select min(LetterID ) from 表名 group by RecipientNo) order by Letterdate desc  


挨骂呀,我面试时遇到这问题了,当时是利用group by 和distinc  貌似这个也能解决的  --------------------编程问答-------------------- 名字重复,可以用distinct(名字) --------------------编程问答--------------------
 --> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
go
create table [TB]([id] int,[b] int)
insert [TB]
select 1,5 union all
select 2,6 union all
select 3,7 union all
select 4,5 union all
select 5,7

select * from [TB] t where not exists(select 1 from TB where t.b=b and t.id>id)

/*
id          b
----------- -----------
1           5
2           6
3           7

(3 行受影响)

*/
drop table [TB]
--------------------编程问答-------------------- 分组,排序 --------------------编程问答-------------------- 1、首先找出有重复的RecipientNo。
select RecipientNO,Count(RecipientNO) as SumCount from privateletter group by RecipientNO Having SumCount>1
2、用遍历方式将RecipientNo依次读取出来当做条件去做删除动作
delete from privateletter where RecipientNo='RecipientNo' and LetterID not in (select Top 1 LetterId from privateletter 
 where RecipientNo='RecipientNo' Order By LetterData Desc)

OK --------------------编程问答-------------------- 最新的是用Min吗?为啥不是Max?
引用 4 楼 hrxqc 的回复:
解决:需要的同志可以参考下
select * from 表名 where LetterID in (select min(LetterID ) from 表名  group by RecipientNo) order by Letterdate desc
--------------------编程问答--------------------
引用 5 楼 bkq421511585 的回复:
引用 4 楼 hrxqc 的回复:
解决:需要的同志可以参考下
select * from 表名 where LetterID in (select min(LetterID ) from 表名 group by RecipientNo) order by Letterdate desc


挨骂呀,我面试时遇到这问题了,当时是利用group by 和distinc  貌似这个也能解决……


贴你的SQL看看 您是怎么用group by 和distinc  来解决的 --------------------编程问答--------------------
select * from sc_privateletter where RecipientNo in (
 
select max(RecipientNo) from sc_privateletter group by  RecipientNo having count(RecipientNo)>1
)
order by LetterDate desc 
--------------------编程问答--------------------

SQLServer 2008新特性分区排名
WITH E
(
SELECT LetterID,LetterNo,RecipientNo,LetterCoontent,LetterDate,
RANK OVER(PARTITION BY LetterNo ORDER BY LetterID DESC ) RANK
---分区排名 ,DESC 获取最近一条信息
FROM privateletter 
)
SELECT *
FROM E
WHERE RANK=1

--------------------编程问答-------------------- 同意13楼
--------------------编程问答-------------------- distinct  top order by 等关键字解决 --------------------编程问答--------------------
引用 13 楼 djy252 的回复:
SQL code

SQLServer 2008新特性分区排名
WITH E
(
    SELECT LetterID,LetterNo,RecipientNo,LetterCoontent,LetterDate,
        RANK OVER(PARTITION BY LetterNo ORDER BY LetterID DESC ) RANK    
        --……

+1 --------------------编程问答--------------------
引用 2 楼 hrxqc 的回复:
RecipientNo中若名字相同 则只查询出最新的那一条


如何这个设计符合现实,那么你还不如发一条删一条,数据库表里规定“LetterNo+RecipientNo”是唯一键不允许重复。至少这样可以保证不至于说写入数据库的东西毫无反应就被你忽略掉了。
--------------------编程问答-------------------- 传统做法用
1.DISTINCT
2.GROUP BY
--------------------编程问答-------------------- 另外提醒你一下,真正的系统没有说写到数据库,然后人家去数据库去查询的。都是不落地直接发送,数据库只是用来做日志、备份的,及时发送完数据10分钟以后才写到数据库也没有关系。 --------------------编程问答-------------------- 存在着:严重的逻辑设计问题(逻辑上明显不符合最起码的测试标准),加上对通讯方面不了解。 --------------------编程问答--------------------
引用 4 楼 hrxqc 的回复:
解决:需要的同志可以参考下
select * from 表名 where LetterID in (select min(LetterID ) from 表名 group by RecipientNo) order by Letterdate desc  

你这个查询出来的是最新的吗 ?  --------------------编程问答--------------------

select a.* from sc_privateletter as a cross apply 
(select top(1) b.LetterID from sc_privateletter as b where a.LetterNo=b.LetterNo order by b.LetterDate) as c 
where a.LetterID=c.LetterID;

这样应该也可以的。 --------------------编程问答--------------------
select a.* from sc_privateletter as a cross apply 
(select top(1) b.LetterID from sc_privateletter as b where a.LetterNo=b.LetterNo order by b.LetterDate desc) as c 
where a.LetterID=c.LetterID;
--------------------编程问答-------------------- 名字重复,可以用distinct(名字) --------------------编程问答-------------------- select * from 表名 where LetterID in (select min(LetterID ) from 表名 group by RecipientNo) order by Letterdate desc --------------------编程问答-------------------- 同意13楼说的 --------------------编程问答--------------------
引用 13 楼 djy252 的回复:
SQL code

SQLServer 2008新特性分区排名
WITH E
(
    SELECT LetterID,LetterNo,RecipientNo,LetterCoontent,LetterDate,
        RANK OVER(PARTITION BY LetterNo ORDER BY LetterID DESC ) RANK    
        ---分区排名……


紧跟技术发展,赞一下 --------------------编程问答-------------------- WITH E
(
    SELECT LetterID,LetterNo,RecipientNo,LetterCoontent,LetterDate,
        RANK() OVER(PARTITION BY LetterNo ORDER BY LetterID DESC ) RANK    
        ---分区排名 ,DESC 获取最近一条信息
    FROM privateletter 
)
SELECT *
FROM E
WHERE RANK=1

--------------------编程问答-------------------- 看不懂  你在说的 --------------------编程问答--------------------
引用 12 楼 david8977 的回复:
SQL code
select * from sc_privateletter where RecipientNo in (
 
select max(RecipientNo) from sc_privateletter group by  RecipientNo having count(RecipientNo)>1
)
order by LetterDate desc


up --------------------编程问答--------------------
引用 7 楼  的回复:
 --> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
go
create table [TB]([id] int,[b] int)
insert [TB]
select 1,5 union all
select 2,6 union all
select 3,7 union all
select 4,5 uni……



这个可以哦
select * from sc_privateletter U where  not exists (select   1 from sc_privateletter  M WHERE U.RecipientNo= M.RecipientNo and U.RecipientID <M.RecipientID)
补充:.NET技术 ,  .NET技术前瞻
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,