科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道教你轻松解决几种常见的SQL疑难问题

教你轻松解决几种常见的SQL疑难问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将教你轻松解决几种常见的SQL疑难问题。

作者:赛迪网 10631 来源:天新网 2008年3月24日

关键字: Mssql 数据库 SQL SQL Server

  • 评论
  • 分享微博
  • 分享邮件

要求:

过滤掉所有多余的重复记录

(1)我们知道distinct、group by 可以过滤重复,于是就有最直观的

select   distinct   *   from   emp   
  或   
  select   name,age   from   emp   group   by   name,age

获得需要的数据,如果可以使用临时表就有解法:

select   distinct   *   into   #tmp     from   emp   
delete   from   emp   
insert   into   emp   select   *   from   #tmp

(2)但是如果不可以使用临时表,那该怎么办?

我们观察到我们没办法区分数据(物理位置不一样,对 SQL Server来说没有任何区别),思路自然是想办法把数据区分出来了,既然现在的所有的列都没办法区分数据,唯一的办法就是再加个列让它区分出来,加什么列好?最佳选择是identity列:

alter   table   emp   add   chk   int   identity(1,1)

表示例:

name age chk   
  Tom 16 1   
  Sun 14 2   
  Tom   16 3   
  Tom 16 4

重复记录可以表示为:

select   *   from   emp     
where     
(select   count(*)   from   emp   e   where   e.name=emp.name)>1

要删除的是:

delete   from   emp     
  where     
    (select   count(*)   from   emp   e   where   
e.name=emp.name   and   e.chk>=emp.chk)>1

再把添加的列删掉,出现结果。

alter   table   emp   drop   column   chk

(3)另一个思路:

视图

select   min(chk)     
  from   emp     
  group   by   name   
  having   count(*)   >1

获得有重复的记录chk最小的值,于是可以

delete     
  from   emp     
  where     
  chk   not   in     
  (   
  select   min(chk)     
  from   emp     
  group   by   name   
  )

写成join的形式也可以:

(1)有例表:emp

emp_no name age   
  001 Tom 17   
  002 Sun 14   
  003 Tom   15   
  004 Tom 16

◆要求生成序列号

(1)最简单的方法,根据b问题的解法:

alter   table   emp   add   chk   int   identity(1,1)   
或   select   *,identity(int,1,1)   chk   into   #tmp   from   emp

◆如果需要控制顺序怎么办?

select   top   100000   *,identity(int,1,1)   
chk   into   #tmp   from   emp   order   by   age

(2) 假如不可以更改表结构,怎么办?

如果不可以唯一区分每条记录是没有办法的,在可以唯一区分每条记录的时候,可以使用a 中的count的思路解决这个问题

select   emp.*,(select   count(*)   from   
emp   e   where   e.emp_no<=emp.emp_no)   
from   emp   
order   by   (select   count(*)   from   
emp   e   where   e.emp_no<=emp.emp_no)
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章