sql刪除重復的行
Ⅰ sql刪除重復數據,只保留一行
在sql的使用中,我們總是碰到需要刪彎棚滾除重復數據的情況,但是又不能全部刪除完,必須要保留至少一個重復的數據。重復的記錄根據兩個欄位 a2,a3 判斷(實際使用中可以拓展為多個)
在上述的表中第三行和第四行重復,我們要選擇一行刪除,流程如下:
結果如下:
得到的結果如下:
|a1|a2|a3|
|---|---|
|3|2|2|
|4|2|2|
|6|2|2|
那麼後面就很好辦埋余了:
3.選出要刪除的值:
結果是保留a1最小的值,其他選項全部選出,
請注意 此時並不是將Select 改為delete就可以了,如果你直接這樣子改的話,會報如下錯誤:
該錯誤提示你,不能先select出和搏同一表中的某些值,再update這個表(在同一語句中)。所以要稍微修改一下。
結果如下:
|a1|a2|a3|
|---|---|
|1|1|1|
|2|1|2|
|3|2|2|
|5|3|3|
完畢
註:如果說不用保留一行數據的話那麼就簡單多了,只需要一個很簡單的sql語句:
Ⅱ sql統計行數,但是需要去重中間的重復數據
userId: user id
url: url visited by the user
SELECT userId, COUNT(DISTINCTurl)
FROM tab
GROUP BY userId
ORDER BY COUNT(DISTINCTurl) DESC
(2)sql刪除重復的行擴展閱讀:
group by 解決重復數據的猛磨個數統計適用於各種關系型資料庫,如oracle,SQL Server
查詢重復的數據
select * from (select v.xh,count(v.xh) num from sms.vehicle v group by v.xh) where num>1;
select v.xh,count(v.xh) num from sms.vehicle v group by v.xh having count(v.xh)=2;
刪除重復的數據
create table mayong as (select distinct* from sms.vehicle);
delete from sms.vehicle ;
insert into sms.vehicle select * from mayong;
在oracle中,有個隱藏了自動rowid,裡面給每條記錄一個唯一的rowid,如果想保留最新的一條記錄,就可以利用這個欄位,保留重復數據中rowid最大的一條記錄就可以了。
下面是查詢重復數據的一個例子:
select a.rowid,a.* from 表枝伏斗名廳啟 a
where a.rowid != (select max(b.rowid) from 表名 b where a.欄位1 = b.欄位1 and a.欄位2 = b.欄位2 )
Ⅲ SQL Server中怎樣可以從SELECT語句的結果集中刪除重復行
在要刪除的有重復數據中存在幾種情況:
1.存在兩條完全相同的紀錄
這是最簡單的一種情況,用關鍵字distinct就可以去掉。
example: select distinct * from table(表名氏手) where (條件)
2.存在禪團部分欄位相同的紀錄(有主鍵id即唯一鍵)
如果是這種情況的話用distinct是過濾不了的,這就要用到主鍵id的唯一性特點及group by分組
example:
select * from table where id in (select max(id) from table group by [去除重復的欄位名列表,....])
3.沒有唯一鍵ID
example:
select identity(int1,1) as id,* into newtable(臨時表) from table
select * from newtable where id in (select max(id) from newtable group by [去除重復的欄位名列表,....])
(3)sql刪除重復的行擴展閱讀:
SQL Server 是Microsoft 公司推出的關系型資料庫管理系統。具有使用方便可伸縮性好與相關軟體集成程度高等優點,可跨越從運行Microsoft Windows 98 的膝上型電腦到運行Microsoft Windows 2012 的大型多處理器的伺服器等賀核橘多種平台使用。
Microsoft SQL Server 是一個全面的資料庫平台,使用集成的商業智能 (BI)工具提供了企業級的數據管理。Microsoft SQL Server資料庫引擎為關系型數據和結構化數據提供了更安全可靠的存儲功能,使您可以構建和管理用於業務的高可用和高性能的數據應用程序。
Ⅳ 詳解如何刪除SQL Server表中的重復行
如果表中有多組完全不同的重復的 PK 值 則逐個刪除它們會很費時間 在這種情況下 可使用下面的方法
首先 運行上面的 GROUP BY 查詢來確定有多少組重復的 PK 值及每組的重復數
選擇重復的鍵值放入臨時表中 例如
SELECT col col col =count(*) INTO holdkey FROM t GROUP BY col col HAVING count(*) >選擇重復的行放入臨時表中 以清除進程中的重復值 例如
SELECT DISTINCT t * INTO holdps FROM t holdkey WHERE t col = holdkey col AND t col = holdkey col拍掘 此時 holdps 表應有唯一的 PK;但是 如果 t 有重復的 PK 而行唯一(如上面的 SSN 示例) 情況就不是這樣了 請驗證 holdps 中的各個鍵是否唯一 是否沒有鍵友旦重復而行唯一的情況 如果是這樣 您必須停在該處 確定對於給定重復的鍵值 您希望保留哪些行 例如 以下查詢
SELECT col col count(*) FROM holdps GROUP BY col col
應為各好賀擾行返回計數 如果結果是 請繼續執行下面的步驟 如果不是 則存在鍵重復而行唯一的情況 且需要您決定要保存哪些行 通常 這將需要舍棄行或為此行創建新的唯一的鍵值 為 holdps 表中每個此種重復 PK 執行這兩個步驟之一
從原始表中刪除重復的行 例如
DELETE t FROM t holdkey WHERE t col = holdkey col AND t col = holdkey col將唯一行放回原始表中 例如
lishixin/Article/program/SQLServer/201311/22468
Ⅳ sql中如何刪除一個表中重復的記錄
sql中刪除一個表中的重復記錄可以採用如下步驟:
1、把a_dist表的記錄用distinct去重,結果放到臨時表中。
select distinct * into #temp from a_dist;
2、把a_dist表的記錄全部刪除。
delete from a_dist;
3、把臨時表中的數據信息導進到a_dist表中,並刪除臨時表。
insert into a_distselect * from #temp;
drop table #temp;
(5)sql刪除重復的行擴展閱讀:
SQL (結構化查詢語言)是用於執行查詢的語法。在資料庫上執行的大部分工作都由 SQL 語句完成。SQL 語言包含用於更新、插入和刪除記錄的語法。
增刪改查指令構成了 SQL 的 DML 部分:
SELECT- 從資料庫表中獲取數據
UPDATE- 更新資料庫表中的數據
DELETE- 從資料庫表中刪除數據
INSERT INTO- 向資料庫表中插入數據
Ⅵ 在SQL中刪除重復記錄(多種方法)
學習sql有一段時間了 發現在我建了一個用來測試的表(沒有建索引)中出現了許多的重復記錄 後來總結了一些刪除重復記錄的方法 在Oracle中 可以通過唯一rowid實現刪除重復記錄 還可以建臨時表來實現 這個只提到其中的幾種簡單實用的方法 希望可以和大家分享(以表employee為例) SQL> desc employee NameNull?Type emp_idNUMBER( )emp_name VARCHAR ( )salaryNUMBER( )可以通過下面的語句查詢重復的記錄 SQL> select * from employee;EMP_ID EMP_NAMESALARY sunshine sunshine滑帆運 信梁 semon semon xyz semon SQL> select distinct * from employee;EMP_ID EMP_NAME SALARY sunshine semon xyz SQL>select * from employee group by emp_id emp_name salary having count (*)> EMP_ID EMP_NAME SALARY sunshine semon SQL> select * from employee e where rowid in (select max(rowid) from employe e where e emp_id=e emp_id ande emp_name=e emp_name and e salary=e salary);EMP_ID EMP_NAME SALARY sunshine xyz轎侍 semon 刪除的幾種方法 ( )通過建立臨時表來實現SQL>create table temp_emp as (select distinct * from employee)SQL> truncate table employee; (清空employee表的數據)SQL> insert into employee select * from temp_emp;(再將臨時表裡的內容插回來)( )通過唯一rowid實現刪除重復記錄 在Oracle中 每一條記錄都有一個rowid rowid在整個資料庫中是唯一的 rowid確定了每條記錄是在Oracle中的哪一個數據文件 塊 行上 在重復的記錄中 可能所有列的內容都相同 但rowid不會相同 所以只要確定出重復記錄中那些具有最大或最小rowid的就可以了 其餘全部刪除 SQL>delete from employee e where rowid not in (select max(e rowid) from employee e wheree emp_id=e emp_id and e emp_name=e emp_name and e salary=e salary); 這里用min(rowid)也可以 SQL>delete from employee e where rowid <(select max(e rowid) from employee e wheree emp_id=e emp_id and e emp_name=e emp_name ande salary=e salary);( )也是通過rowid 但效率更高 SQL>delete from employee where rowid not in (select max(t rowid) from employee t group byt emp_id t emp_name t salary); 這里用min(rowid)也可以 EMP_ID EMP_NAME SALARY sunshine xyz semon SQL> desc employee NameNull?Type emp_idNUMBER( )emp_name VARCHAR ( )salaryNUMBER( )可以通過下面的語句查詢重復的記錄 SQL> select * from employee;EMP_ID EMP_NAMESALARY sunshine sunshine semon semon xyz semon SQL> select distinct * from employee;EMP_ID EMP_NAME SALARY sunshine semon xyz SQL>select * from employee group by emp_id emp_name salary having count (*)> EMP_ID EMP_NAME SALARY sunshine semon SQL> select * from employee e where rowid in (select max(rowid) from employe e where e emp_id=e emp_id ande emp_name=e emp_name and e salary=e salary);EMP_ID EMP_NAME SALARY sunshine xyz semon 刪除的幾種方法 ( )通過建立臨時表來實現SQL>create table temp_emp as (select distinct * from employee)SQL> truncate table employee; (清空employee表的數據)SQL> insert into employee select * from temp_emp;(再將臨時表裡的內容插回來)( )通過唯一rowid實現刪除重復記錄 在Oracle中 每一條記錄都有一個rowid rowid在整個資料庫中是唯一的 rowid確定了每條記錄是在Oracle中的哪一個數據文件 塊 行上 在重復的記錄中 可能所有列的內容都相同 但rowid不會相同 所以只要確定出重復記錄中那些具有最大或最小rowid的就可以了 其餘全部刪除 SQL>delete from employee e where rowid not in (select max(e rowid) from employee e wheree emp_id=e emp_id and e emp_name=e emp_name and e salary=e salary); 這里用min(row lishixin/Article/program/Oracle/201311/18369
Ⅶ sql中怎麼刪除兩條重復記錄並保留一條
將數據去弊察余重復後暫存到臨時表#a中
selectdistinct*into#afromtable1where條件
deletetable1where刪除限制條件
insert沒旅intotable1select*from#a-將暫存的數據插回資料庫
droptable#a-刪除臨時表
註:當前的資料庫,每一個表都應該租滾有一個標志欄位,以保證記錄不完全重復,否則實用中極易出問題。
(7)sql刪除重復的行擴展閱讀:
SQL語句刪除掉重復的其他情況
1、查找表中多餘的重復記錄,重復記錄是根據單個欄位(peopleId)來判斷
SELECT
*
FROM
people
WHERE
peopleId IN (
SELECT
peopleId
FROM
people
GROUP BY
peopleId
HAVING
count(peopleId) > 1
)
2、查找表中多餘的重復記錄(多個欄位)
SELECT
*
FROM
vitae a
WHERE
(a.peopleId, a.seq) IN (
SELECT
peopleId,
seq
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)
參考資料來源:結構化查詢語言(SQL)-網路
Ⅷ SQL查詢中如何剔除重復
1,存在兩條完全相同的紀錄
這是最簡單的一種情況,用關鍵字distinct就可以去掉
example: select distinct * from table(表名) where (條件)
2,存在部分欄位相同的紀錄(有主鍵id即唯一鍵)
如果是這種情況的話用distinct是過濾不了的,這就要用到主鍵id的唯一性特點及group by分組
example:
select * from table where id in (select max(id) from table group by [去除重復的欄位名列表,....])
3,沒有唯一鍵ID
example:
select identity(int1,1) as id,* into newtable(臨時表) from table
select * from newtable where id in (select max(id) from newtable group by [去除重復的欄位名列表,....])
drop table newtable
(8)sql刪除重復的行擴展閱讀
1、查找表中多餘的重復記錄,重復記錄是根據單個欄位(peopleId)來判斷
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 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)
3、查找表中多餘的重復記錄(多個欄位)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
Ⅸ sql 去掉重復行
select distinct news.id,title,d_time,imgurl from news,Img where news.id =new_id 在SQL Server中有一個關鍵字distinct,這蘆尺個就絕橘是去掉重陪宏高復行的該關鍵字具體用法參看SQL幫助
Ⅹ sql命令裡面去掉重復值是使用distinct
DISTINCT關鍵字可從SELECT語句的結果中消除重復的行。如果沒有指定DISTINCT,將返回所有行,包括重復的行。
例如,如果選擇ProctInventory中的所有產品ID時沒有使用DISTINCT,將返回1069行。
如果使用了DISTINCT,就可以消除重復的行,只查看唯一的產品ID:USEAdventureWorks;.ProctInventory此查詢將返回432行。
DISTINCT關鍵字可從SELECT語句的結果中除去重復的行。如果沒有指定DISTINCT,那麼將返回所有行,包括重復的行。