`

SQL重复查询及触发器的使用

阅读更多
 2007.07.13  jackey  好东西
 
SQL重复查询及触发器的使用
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
例二:
select * from testtable
where numeber in (select number from people group by number having count(number) > 1 )
可以查出testtable表中number相同的记录

 

select * from tYHXGX
where SJHM in (select SJHM from tYHXGX group by SJHM having count(SJHM) > 1 )

 

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId   having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

 

delete from tYHXGX1
where SJHM in (select SJHM from tYHXGX1 group by SJHM   having count(SJHM) > 1)
and id not in (select min(id) from tYHXGX1 group by SJHM having count(SJHM )>1)

 

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;


Select Name,Count(*) From A Group By Name Having Count(*) > 1

 


Select SJHM,Count(*) From tYHXGX  Group By SJHM Having Count(*) > 1

 

如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1


(三)
方法一

declare @max integer,@id integer

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

delete from 表名 where 主字段 = @id

fetch cur_rows into @id,@max

end

close cur_rows

set rowcount 0

  方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用

select distinct * from tableName

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName

drop table tableName

select * into tableName from #Tmp

drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)
查询重复

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1

)

另:

创建触发器和使用示例(于海涛 老师的实验课)


1、数据表的建立

use login

create table voteMaster   -----主表
(
voteId int primary key,    --编号
voteTitle varchar(100) not null,   ---投票的项目
voteSum int default 0   --总票数,默认为0
)
insert into voteMaster values(1,'选举工会主席',0)
insert into voteMaster values(2,'对网站的建议',0)

create table voteDetails    ---从表
(
voteId int foreign key references voteMaster(voteId),----外键 约束
voteDetailsId int not null,
voteItem varchar(20) not null,
votNum int default 0,
primary key(voteId,voteDetailsId)          ----连合主键
)


insert into voteDetails values(1,1,'于海涛',0)
insert into voteDetails values(1,2,'王小刚',0)
insert into voteDetails values(1,3,'张老三',0)

insert into voteDetails values(2,1,'非常好',0)
insert into voteDetails values(2,2,'好',0)
insert into voteDetails values(2,3,'一般',0)
insert into voteDetails values(2,4,'需要改进',0)

2、触发器的创建

create trigger updateMaster   -----创建触发器
on voteDetails     -----触发器所建的表
for update         -----触发器的条件
as
begin
           update voteMaster set voteSum=voteSum+1 where voteId=(select top 1 voteid from inserted)
end

最终效果:

你只要对voteDetails 内votNum的数据进行更新,那么主表voteMaster 的voteSum就会加1,从而实现了对投票的总数的统计的实现。

注意:    select top 1 voteid from deleted

          inserted表   deleted表
insert 新插入的行 空
update 数据库受到影响的行在更新之后的新值 数据库受到影响的行在更新之前的旧值
delete 空 删除的行

 

 

 

 

当你想自动更新数据库的时候 无论数据库怎样更新,插入新数据也好,自动在后面添加你想添加的东西


create trigger trig_notic_UI
on notic for insert,update
as
update notic set memo=memo+'<dcboy>'
where id in(select id from inserted)
go


/*
trig_notic_UI   触发器名称 自定义
notic 需要触发的表名
memo 需要更新的字段
id   是主键
*/

分享到:
评论

相关推荐

    SQL存储过程,触发器讲解及过程中要注意的内容

    存储过程是一组预先编译的SQL语句,存储在数据库中并可重复使用。它们允许开发人员封装复杂的查询和操作,提高代码复用性,减少网络流量,并且可以提升性能。创建存储过程通常包括定义输入参数、输出参数以及过程体...

    SQL SERVER 触发器视频讲解

    在SQL Server中,触发器是一种特殊的存储过程,它在数据库中的特定事件发生时自动执行,如数据插入、更新或删除操作。本视频讲解将深入探讨触发器的创建、编辑、修改及其功能,帮助用户更好地理解和应用这些技术。 ...

    解密SQL触发器、存储过程、函数

    总的来说,掌握SQL触发器、存储过程和函数的使用,能够让你更好地管理和维护数据库,提升数据处理的效率和准确性。理解它们的工作原理并熟练运用,是每个数据库管理员和开发者的必备技能。在实际工作中,结合具体的...

    SQL Server触发器

    SQL Server触发器是数据库管理系统中的一种特殊类型的存储过程,它在特定的数据操作事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器的主要作用是扩展SQL语句的功能,用于实现复杂的业务规则,确保数据的...

    SQLServer触发器实现不同服务器数据同步.pdf

    本文的描述部分重复了标题的内容,强调了使用 SQL Server 触发器来实现不同服务器之间的数据同步的重要性。 标签解释 本文的标签“技术”表明了本文的内容是技术相关的,属于 IT 行业的知识领域。 部分内容解释 ...

    ORACLE PL/SQL 存储过程 触发器

    在文档`oracle.doc`和`PLSQL块.doc`中,可能会详细阐述如何创建、调用存储过程,定义触发器的语法,以及如何在PL/SQL中有效地使用游标。通过学习这些内容,你可以深入了解如何利用Oracle的PL/SQL来构建高效、可靠的...

    SQL各种查询方法

    以上是SQL2000中的各种查询方法,这些基础知识对于理解和使用任何SQL数据库都是非常重要的。通过熟练掌握这些方法,你可以高效地从数据库中获取你需要的信息。在实际应用中,还可以结合存储过程、触发器、视图等高级...

    SQL语句_设置序列和触发器

    ### SQL语句设置序列和触发器 在数据库管理中,序列和触发器是两种非常重要的机制,它们可以提高数据处理的效率和准确性。通过合理的设置,可以自动化许多重复性任务,减少开发工作量并增强系统的稳定性。下面我们...

    数据库之—用触发器实现每个学生最多只能选择3门课程

    通过以上知识点的详细介绍,我们不仅理解了触发器的基本概念和用途,还具体了解了如何使用触发器来限制学生选课数量的方法和步骤,以及触发器在实际应用中的优势和潜在的问题。这对于理解和运用触发器解决实际问题...

    SQL2005触发器简介.pdf

    4. 调用更多的存储过程:约束的本身是不能调用存储过程的,但是触发器本身就是一种存储过程,而存储过程是可以嵌套使用的,所以触发器也可以调用一个或多个存储过程 5. 发送 SQL Mail:在 SQL 语句执行完之后,...

    SQLServer中复杂sql语句查询

    在处理复杂逻辑或重复使用的查询时,存储过程是非常实用的工具。 **查询优化**是确保SQL语句高效运行的重要环节。这包括使用EXPLAIN PLAN分析查询执行计划,调整索引策略,避免全表扫描,合理使用子查询和临时表,...

    sql中关于触发器的课件及存储过程

    在SQL(Structured Query Language)中,触发器和存储过程是两个重要的数据库管理工具,它们用于扩展数据库的功能并实现复杂的业务逻辑。以下是对这两个概念的详细解释: **触发器(Triggers)** 触发器是一种...

    SQL Server中触发器技术的研究.pdf

    非规范数据通常包含在表中重复或衍生出来的数据,通过触发器可以保证这些非规范化数据的准确性。 三、触发器的创建与使用 创建触发器的基本语法如下: ```sql CREATE TRIGGER trigger_name ON table_or_view {[ ...

    Oracle创建主键自增表(sql语句实现)及触发器应用

    下面将详细讲解如何通过SQL语句实现这一功能,并结合触发器的应用来自动增加主键。 首先,我们创建一个包含主键的表。在Oracle中,主键用于唯一标识表中的每一行,且不允许有重复值。以下是一个创建名为`Test_...

    sql server 2005 技术内幕t-sql查询源码

    阐述事务的ACID属性,以及SQL Server中的事务管理,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)隔离级别,同时可能涉及死锁问题及解决...

    SQLServer实用教程(第三版)实验7存储过程和触发器的使用.pdf

    存储过程是一种预编译的 SQL 语句集,可以重复使用,以提高数据库的性能和安全性。创建存储过程可以使用 CREATE PROCEDURE 语句,例如: ```sql CREATE PROCEDURE TEST @NUMBER1 int OUTPUT AS BEGIN DECLARE @...

    SQL server2008存储过程与触发器

    在提供的"第一次大作业.doc"可能包含了关于如何编写和使用存储过程和触发器的实验说明,而"SQLQuery1.sql"可能包含了一些示例查询或存储过程的代码。通过深入学习这些文档和代码,你可以更深入地理解SQL Server 2008...

    数据库SQL知识点总结、代码及练习题代码

    4.关于cascade使用的sql文件 删除重复行只留一行的sql文件 5.数据表操作的习题课1和2的sql文件 6.t-sql知识点和有练习题的sql文件 7.触发器 存储过程 索引 视图 知识点及sql文件 8.事务ACID理解

    sql2000查询分析器

    尽管如此,了解和掌握SQL2000查询分析器的使用仍然是理解数据库查询和管理的基础,尤其是在处理旧系统或需要在无企业管理器环境下工作的场景中。通过使用"SQLchaxunfx"这样的压缩包文件,用户可以方便地在任何支持的...

    数据库原理及应用实验四(存储过程和触发器)

    存储过程是预编译的SQL语句集合,它可以在数据库服务器上执行,可以被看作是数据库中的可重复使用的功能模块。在本实验中,学生需要掌握如何创建、执行、管理和维护存储过程。例如,stu_pr存储过程用于查询051班所有...

Global site tag (gtag.js) - Google Analytics