例子:
建表: create
table
tablename (id
int
identity(1,1),attachid
int
,
name
varchar
(10))
insert
into
tablename values
(23,
‘sss‘
)
insert
into
tablename
values
(33,
‘sdfs‘
)
insert
into
tablename
values
(33,
‘4434‘
)
insert
into
tablename
values
(45,
‘dsdsd‘
)
select
*
from
tablename as a
where
not
exists (
select
1
from
tablename where
attachid=a.attachid
and
name
<a.
name
)
内层的 外层的 内层 外层
按某个字段去重 保留按某个字段排序的最大/小值
后面括号里的意思是再从原表中找有没有比当前记录相同字段的比较字段更大或更小的 如果有 则不插入 如果没有 则插入
exists 是个条件 后面的结果集有值的时候 条件成立 后面结果集为空的时候 条件不成立 所以后面子查询中select 后面跟什么字段不重要 关键是看结果集是否为空
加not 是取相反的意思
name <a.name 是取最小的 反之是取最大的
原数据
id attachid name
1 23 sss
2 33 sdfs
3 33 4434
4 45 dsdsd
比较后
id attachid
name
----------- ----------- ----------
1 23 sss
3 33 4434
4 45 dsdsd
注意:from后面不能跟别名只能跟临时表 #table
复杂一点的例子:
查询 WorkFlowTask 表中 ReceiveID为某值 而且状态是2或者3的 记录 而且在同样GroupID 中只保留时间最新的 并且结果按完成时间排序
(select * from
( SELECT *,ROW_NUMBER() OVER(ORDER BY CompletedTime1 DESC) AS PagerAutoRowNumber
FROM WorkFlowTask
WHERE ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3) ) as a
where not exists --其实后面只是一个查询条件(包含子查询)
(select 1 from WorkFlowTask
where GroupID=a.GroupID and ReceiveTime>a.ReceiveTime and ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3)
)