1、必須保證表中有主鍵或者唯一索引,或者某列數據不能重復。只有這樣,才可能使用一句SQL來實現。否則只能考慮其它辦法。下面的語句,假定BB列是不重復的,刪除後保存BB列值最大的那條記錄。
delete
from
表
where
aa
in
(select
aa
from
表
group
by
aa
having
count(aa)
>
1)
and
bb
not
in
(select
max(bb)
from
表
group
by
aa
having
count(aa)
>
1);
2、有多種寫法:
delete
A
from
B
where
A.AA
=
B.AA
delete
A
from
A,B
where
A.AA
=
B.AA
delete
A
where
AA
in
(select
AA
from
B)
3、使用into關鍵字:
select
*
into
新表名
from
原表
4、取數據前3位,欄位必須是類似char類型,使用類似substring這樣的函數(SYBASE是substring,ORACLE是substr):
select
substring(欄位,1,3)
from
表名
Ⅱ SQL語句查詢 如何刪除重復多餘的數據
這個是SQL中distinct的典型用法:
1)從字面意思就可以了解到:
distinct
[dis'tiŋkt]
adj.
明顯的;獨特的;清楚的;有區別的
2)在SQL中用distinct來消除重復出現的欄位值。
使得每個欄位值只出現一次。
具體用法如下:
select
distinct
欄位名
from
表;
distinct
欄位名
意思就是只顯示一次該欄位名
一般情況下和order
by
結合使用,這樣可以提高效率。
所以這個問題的答案是:select
distinct
1,2,3,4
from
表;
1,2,3,4分別代表第一,二,三,四列的欄位名,我猜測可能第一列就是每個人的ID,
這樣你把重復的ID過濾留下一個,估計就是你想要的結果了。
希望我的回答能讓您滿意。
Ⅲ SQL查詢,如何去除重復的記錄
首先,先說明一個問題。這樣的結果出現,說明系統設計是有問題的。
其次
刪除重復數據,你要提供你是什麼資料庫。
不同資料庫會有不同的解決方案。
關鍵字Distinct 去除重復,如下列SQL,去除Test相同的記錄;
1. select distinct Test from Table
2. 如果是要刪除表中存在的重復記錄,那就邏輯處理,如下:
3. select Test from Table group by Test having count(test)>1
4. 先查詢存在重復的數據,後面根據條件刪除
還有一個更簡單的方法可以嘗試一下:
select aid, count(distinct uid) from 表名 group by aid
這是sqlserver 的寫法。
如圖一在數據表中有兩個膀胱沖洗重復的記錄。
Ⅳ SQL語句怎麼刪除重復的數據
刪除重復的數據
delete
from
tb
where
id
not
in
(
select
id
from
(select
fileSize,fileName
,max(id)
id
from
tb
group
by
filesize,filename
)
a
)
現在完成了重復數據的刪除,主要是利用了找出某個分組中最大的那個id,其中包括了所有不重復的id,然後使用not
in將需要保留的排除。
Ⅳ SQL中表裡面怎麼刪除重復數據
出現這種情況的原因是你的表沒有建立關鍵字,當出現重復數據時,sqlserver自帶的圖形化工具刪除就會出現你出現的問題,即不能刪除也不能更新,你可以使用如下方法解決:
1、給表建立關鍵字,比如增加一列自增的欄位,這時候就可以刪除了,刪除完成後再刪除新增的列即可
2、不增加欄位,使用delete語句刪除,但是這種情況會刪除符合條件的數據,包括重復的數據
3、推薦使用1的方法
Ⅵ 如何刪除資料庫中的冗餘數據
刪除所有大於你
設置有數的冗餘組
DELETE
FROM Customers
WHERE ID IN
(SELECT ID
FROM
(SELECT ID, LastName, FirstName,
RANK() OVER (PARTITION BY LastName,
FirstName ORDER BY ID) AS SeqNumber
FROM
(SELECT ID, LastName, FirstName
FROM Customers
WHERE (LastName, FirstName) IN
(SELECT LastName, FirstName
FROM Customers
GROUP BY LastName, FirstName
HAVING COUNT(*) > 3)))
WHERE SeqNumber > 3);
As you can see, using the RANK() function allows you to eliminate plicates in a
single SQL statement and gives you more capabilities by extending the power of
your
queries.
正如你所見使用Rank()可以消除冗餘數據而且能給你很大的可伸展性
Ⅶ sql刪除資料庫中重復的數據語句怎麼寫
你要先找到規律,並且有確定的限制條件。是否所有的重復數據都刪了只留一條?舊數據和新數據的界定是什麼?是某個時刻?那舊數據中有重復數據刪不刪?重復數據是指僅僅title欄位信息一樣?
如果是在工作上,刪除數據是一項很嚴謹的事,這個你必須要想清楚所有的條件情況,只是這樣幾句話,讓網友給個sql語句,直接用上去,害的是你自己。
也不知道你的資料庫具體是怎麼樣的,給個一般刪除重復數據的方法
select
distinct
*
into
#Tmp_aa
from
tableName
把不重復的找出來插入到臨時表
drop
table
tableName
刪掉原來的表
select
*
into
tableName
from
#Tmp_aa
把臨時表插入到新建的tableName
drop
table
#Tmp_aa
刪掉臨時表
Ⅷ SQL中的數據冗餘的最佳解決方法是什麼
數據應該盡可能少地冗餘,這意味著重復數據應該減少到最少。比如說,一個部門雇員的電話不應該被存儲在不同的表中, 因為這里的電話號碼是雇員的一個屬性。如果存在過多的冗餘數據,這就意味著要佔用了更多的物理空間,同時也對數據的維護和一致性檢查帶來了問題,當這個員工的電話號碼變化時,冗餘數據會導致對多個表的更新動作,如果有一個表不幸被忽略了,那麼就可能導致數據的不一致性。 從一範式轉化到二範式根據第二範式的定義,轉化為二範式就是消除部分依賴。考察表1-1,我們可以發現,非主屬性<Project Name>部分依賴於主鍵中的<Project Number>; 非主屬性<Employee Name>,<Salary Category>和<Salary package>都部分依賴於主鍵中的<Employee Number>;表1-1的形式,存在著以下潛在問題:1. 數據冗餘:每一個欄位都有值重復;2. 更新異常:比如<Project Name>欄位的值,比如對值"TPMS"了修改,那麼就要一次更新該欄位的多個值;3. 插入異常:如果新建了一個Project,名字為TPT, 但是還沒有Employee加入,那麼<Employee Number>將會空缺,而該欄位是主鍵的一部分,因此將無法插入記錄;Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(100003, 'TPT', NULL, NULL, NULL, NULL)
4. 刪除異常:如果一個員工 200003, Kevin 離職了,要將該員工的記錄從表中刪除,而此時相關的Salary信息 C 也將丟失, 因為再沒有別的行紀錄下 Salary C的信息。Delete from sample where EMYNUM = 200003
Select distinct SALCATEGORY, SALPACKAGE from SAMPLE因此,我們需要將存在部分依賴關系的主屬性和非主屬性從滿足第一範式的表中分離出來,形成一張新的表,而新表和舊表之間是一對多的關系。由此,我們得到:
CREATE TABLE "PROJECT" ( "PRJNUM" INTEGER NOT NULL, "PRJNAME" VARCHAR(200)) IN "USERSPACE1";ALTER TABLE "PROJECT" ADD PRIMARY KEY ("PRJNUM");Insert into PROJECT(PRJNUM, PRJNAME) values(100001, 'TPMS'), (100002, 'TCT');
表1-2
表 1-3
CREATE TABLE "EMPLOYEE" ( "EMYNUM" INTEGER NOT NULL, "EMYNAME" VARCHAR(200), "SALCATEGORY" CHAR(1), "SALPACKAGE" INTEGER) IN "USERSPACE1";ALTER TABLE "EMPLOYEE" ADD PRIMARY KEY ("EMYNUM");Insert into EMPLOYEE(EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(200001,'Johnson', 'A', 2000), (200002, 'Christine', 'B', 3000), (200003, 'Kevin', 'C',4000), (200004, 'Apple', 'B', 3000);Employee Number Employee Name Salary Category Salary Package200001 Johnson A 2000200002 Christine B 3000200003 Kevin C 4000200004 Apple B 3000
CREATE TABLE "PRJ_EMY" ( "PRJNUM" INTEGER NOT NULL, "EMYNUM" INTEGER NOT NULL) IN "USERSPACE1";ALTER TABLE "PRJ_EMY" ADD PRIMARY KEY ("PRJNUM", "EMYNUM");Insert into PRJ_EMY(PRJNUM, EMYNUM) values(100001, 200001), (100001, 200002),(100001, 200003), (100002, 200001), (100002, 200004);
同時,我們把表1-1的主鍵,也就是表1-2和表1-3的各自的主鍵提取出來,單獨形成一張表,來表明表1-2和表1-3之間的關聯關系:
表 1-4
這時候我們仔細觀察一下表1-2, 1-3, 1-4, 我們發現插入異常已經不存在了,當我們引入一個新的項目 TPT 的時候,我們只需要向表1-2 中插入一條數據就可以了, 當有新人加入項目 TPT 的時候,我們需要向表1-3, 1-4 中各插入一條數據就可以了。雖然我們解決了一個大問題,但是仔細觀察我們還是發現有問題存在。
回頁首
從二範式轉化到三範式考察表前面生成的三張表,我們發現,表1-3存在傳遞依賴關系,即:關鍵欄位< Employee Number > --> 非關鍵欄位< Salary Category > -->非關鍵欄位< Salary Package >。而這是不滿足三範式的規則的,存在以下的不足:1、 數據冗餘:<Salary Category>和<Salary Package>的值有重復;2、 更新異常:有重復的冗餘信息,修改時需要同時修改多條記錄,否則會出現數據不一致的情況;3、 刪除異常:同樣的,如果員工 200003 Kevin 離開了公司,會直接導致 Salary C 的信息的丟失。Delete from EMPLOYEE where EMYNUM = 200003
Select distinct SALCATEGORY, SALPACKAGE from EMPLOYEE因此,我們需要繼續進行規范化的過程,把表1-3拆開,我們得到:
表 1-5
和
表 1-6
這時候如果 200003 Kevin 離開公司,我們只需要從表 1-5 中刪除他就可以了, 存在於表1-6中的Salary C信息並不會丟失。但是我們要注意到除了表 1-5 中存在 Kevin 的信息之外, 表1-4中也存在 Kevin 的信息, 這很容易理解, 因為 Kevin 參與了項目 100001, TPMS, 所以當然也要從中刪除。 至此,我們將表1-1經過規范化步驟,得到四張表,滿足了三範式的約束要求,數據冗餘、更新異常、插入異常和刪除異常。在三範式之上,還存在著更為嚴格約束的BC範式和四範式,但是這兩種形式在商業應用中很少用到,在絕大多數情況下,三範式已經滿足了資料庫表規范化的要求,有效地解決了數據冗餘和維護操作的異常問題。
Ⅸ SQL中如何刪除重復數據
select
欄位1,欄位2,欄位3
from
table
group
by
欄位1,欄位2,欄位3
having
count(*)>1
用上邊這句能找出所有重復的數據
欄位1,2,3你替換成你表裡的欄位名,如果有更多欄位的話,你就繼續添加,最後group
by的時候不要忘記了
刪除的時候要建立一個臨時表
create
table
new_table
as
select
欄位1,欄位2,欄位3
from
old_table
group
by
欄位1,欄位2,欄位3;
然後刪除原表數據
truncate
table
old_table;
然後把臨時表數據反插回去
insert
into
new_table
select
*
from
old_table;