国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

sql查詢表里重復記錄現取重復最后一條記錄方法

2024-07-24 12:37:39
字體:
來源:轉載
供稿:網友

本文章來給大家介紹關于sql查詢表里取不唯一記錄取最后一行方法,有需要了解的同學可進入參考參考。

SQL語句去掉重復記錄,獲取重復記錄,查詢一個表中有效去掉重復的記錄,UserID為自增長主鍵,RoleID為重復字段,代碼如下:

  1. SELECT MIN(UserID) AS UserID, RoleID FROM tmpTable GROUP BY RoleID 
  2. SELECT RoleID FROM tmpTable GROUP BY RoleID HAVING (COUNT(*) > 1) 
  3. SELECT DISTINCT * FROM tmpTable 

sql語句查詢 sql server access 數據庫里的所有表名,字段名2007年02月01日 星期四 下午 04:21SQL SERVER,查看所有表名,代碼如下:

select   name   from   sysobjects   where   type='U'

查詢表的所有字段名,代碼如下:

  1. Select name from syscolumns Where ID=OBJECT_ID('表名'
  2. select * from information_schema.tables  
  3. select * from information_schema.views  
  4. select * from information_schema.columns  
  5. ACCESS 

查看所有表名,代碼如下:

select   name   from   MSysObjects   where   type=1   and   flags=0

MSysObjects是系統對象,默認情況是隱藏的,通過工具、選項、視圖、顯示、系統對象可以使之顯示出來.

例,如下表:

  1. CREATE TABLE `t1` ( 
  2. `userid` INT(11) DEFAULT NULL
  3. `atime` datetime DEFAULT NULL
  4. KEY `idx_userid` (`userid`) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

數據如下:

  1. MySQL> SELECT * FROM t1; 
  2. +--------+---------------------+ 
  3. | userid | atime | 
  4. +--------+---------------------+ 
  5. | 1 | 2013-08-12 11:05:25 | 
  6. | 2 | 2013-08-12 11:05:29 | 
  7. | 3 | 2013-08-12 11:05:32 | 
  8. | 5 | 2013-08-12 11:05:34 | 
  9. | 1 | 2013-08-12 11:05:40 | 
  10. | 2 | 2013-08-12 11:05:43 | 
  11. | 3 | 2013-08-12 11:05:48 | 
  12. | 5 | 2013-08-12 11:06:03 | 
  13. +--------+---------------------+ 
  14. ROWS IN SET (0.00 sec) 

其中userid不唯一,要求取表中每個userid對應的時間離現在最近的一條記錄,初看到一個這條件一般都會想到借用臨時表及添加主建借助于join操作之類的.

給一個簡方法,代碼如下:

  1. MySQL> SELECT userid,substring_index(group_concat(atime ORDER BY atime DESC),",",1) AS atime FROM t1 GROUP BY userid; 
  2. +--------+---------------------+ 
  3. | userid | atime | 
  4. +--------+---------------------+ 
  5. | 1 | 2013-08-12 11:05:40 | 
  6. | 2 | 2013-08-12 11:05:43 | 
  7. | 3 | 2013-08-12 11:05:48 | 
  8. | 5 | 2013-08-12 11:06:03 |   --Vevb.com 
  9. +--------+---------------------+ 
  10. ROWS IN SET (0.03 sec) 

比方說,在A表中存在一個字段“name”,而且不同記錄之間的“name”值有可能會相同,現在就是需要查詢出在該表中的各記錄之間,“name”值存在重復的項,代碼如下:

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

如果還查性別也相同大則如下:

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

方法一,代碼如下:

  1. declare @max integer,@id integer 
  2. declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1 
  3. open cur_rows 
  4. fetch cur_rows into @id,@max 
  5. while @@fetch_status=0 
  6. begin 
  7. select @max = @max -1 
  8. set rowcount @max 
  9. delete from 表名 where 主字段 = @id 
  10. fetch cur_rows into @id,@max 
  11. end 
  12. close cur_rows 
  13. set rowcount 0 

方法二,有兩個意義上的重復記錄,一是完全重復的記錄,也即所有字段均重復的記錄,二是部分關鍵字段重復的記錄,比如Name字段重復,而其他字段不一定重復或都重復可以忽略.

1、對于第一種重復,比較容易解決,使用代碼如下:

select distinct * from tableName

就可以得到無重復記錄的結果集,如果該表需要刪除重復的記錄,重復記錄保留1條,可以按以下方法刪除,代碼如下:

  1. select distinct * into #Tmp from tableName 
  2. drop table tableName 
  3. select * into tableName from #Tmp 
  4. drop table #Tmp 

發生這種重復的原因是表設計不周產生的,增加唯一索引列即可解決.

2、這類重復問題通常要求保留重復記錄中的第一條記錄,操作方法如下,假設有重復的字段為Name,Address,要求得到這兩個字段唯一的結果集,代碼如下:

  1. select identity(int,1,1) as autoID, * into #Tmp from tableName 
  2. select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID 
  3. select * from #Tmp where autoID in(select autoID from #tmp2) 

最后一個select即得到了Name,Address不重復的結果集,但多了一個autoID字段,實際寫時可以寫在select子句中省去此列.

查詢重復,代碼如下:

  1. select * from tablename where id in ( 
  2. select id from tablename 
  3. group by id 
  4. having count(id) > 1 
  5. )

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乡城县| 徐州市| 临海市| 方山县| 桃源县| 财经| 清苑县| 蒲江县| 日土县| 加查县| 澄城县| 玛多县| 吉林省| 武城县| 会理县| 墨玉县| 鄂温| 三原县| 彭州市| 云梦县| 怀宁县| 和林格尔县| 南部县| 游戏| 崇仁县| 山东| 绍兴县| 龙胜| 酒泉市| 女性| 海晏县| 潼关县| 福泉市| 平原县| 顺昌县| 微博| 右玉县| 酒泉市| 调兵山市| 黄龙县| 时尚|