SQL子查询二则
1.查找唯一值
实现原理为:先取不与我相同的标识号的内容,而我的内容又不存在这些内容中,所以我的内容是唯一的.即即唯一值
例子:在一个用户表中取出唯一组的用户
if object_id('Test_Users') is not null
drop table Test_Users
go
create table Test_Users(AutoID int identity(1,1) primary key,UserGroupID int,UserName varchar(50))
go
set xact_abort on
begin tran
insert into Test_Users(UserGroupID,UserName)
select 2,'aa' union
select 2,'bb' union
select 3,'cc' union
select 1,'Admin' union
select 3,'ff' union
select 2,'pp'
commit tran
go
select * from Test_Users a
where UserGroupID not in
(select UserGroupID from Test_Users where AutoID<>a.AutoID)
---这样找出的结果是
AutoID UserGroupID UserName
----------- ----------- --------------------------------------------------
1 1 Admin
(所影响的行数为 1 行)
2.查找结果不重复
实现原理为:重复数据字段选择一个最大值或者最小值.而选择的时候指向这个值.其实这是把重复字段部分分成了组.但分组计算不能取所有数据.
--仍然用以上数据
--这是取最大值
select * from Test_Users a
where AutoID>=
(select max(AutoID) from Test_Users b where a.UserGroupID=b.UserGroupID)
--这是取最小值
select * from Test_Users a
where AutoID>=
(select max(AutoID) from Test_Users b where a.UserGroupID=b.UserGroupID)
--也可以用分组计算
select UserGroupID from Test_Users
group by UserGroupID
