DISTINCT 關鍵字可從 SELECT 語句的結果中消除重復的行。如果沒有指定 DISTINCT,將返回所有行,包括重復的行。例如,如果選擇 ProctInventory 中的所有產品 ID 時沒有使用 DISTINCT,將返回 1069 行。
如果使用了 DISTINCT,就可以消除重復的行,只查看唯一的產品 ID:
USE AdventureWorks;
GO
SELECT DISTINCT ProctID
FROM Proction.ProctInventory
此查詢將返回 432 行。
Ⅱ 資料庫oracle中怎麼用distinct取消重復行
首先,對你的需求有點模糊,取消c_id的重復行,然後還顯示c_id,s_id。上面兩個SQL不知道是否滿足你的需求,就比如
select
distinct
c_id,s_id
from
xskc
,這條語句消除的是c_id和s_id同時一樣的記錄,所以單就c_id,還是會有重復的情況。
SQL>
desc
p
Name
Null?
Type
-----------------------------------------
--------
----------------------------
ID
NUMBER
NAME
VARCHAR2(10)
SQL>
select
*
from
p;
ID
NAME
----------
----------
1
AAA
2
AAA
1
BBB
3
BBB
SQL>
select
distinct
id,name
from
p;
ID
NAME
----------
----------
1
AAA
1
BBB
2
AAA
3
BBB
SQL>
select
distinct
id
from
p;
ID
----------
1
2
3
所以不管怎麼樣,如果你要顯示c_id和s_id的話,c_id基本都可能重復,除非你還有其他的條件限制
Ⅲ 我想刪除資料庫表中重復的行 ,用oracle怎麼寫,急求代碼
在Oracle中如何利用Rowid查找和刪除表中的重復記錄 選擇自 cn_chenfeng 的 Blog
關鍵字 在Oracle中如何利用Rowid查找和刪除表中的重復記錄
出處
平時工作中可能會遇到當試圖對庫表中的某一列或幾列創建唯一索引時,系統提示 ORA-01452 :不能創建唯一索引,發現重復記錄。
下面總結一下幾種查找和刪除重復記錄的方法(以表CZ為例):
表CZ的結構如下:
SQL> desc cz
Name Null? Type
----------------------------------------- -------- ------------------
C1 NUMBER(10)
C10 NUMBER(5)
C20 VARCHAR2(3)
刪除重復記錄的方法原理:
(1).在Oracle中,每一條記錄都有一個rowid,rowid在整個資料庫中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個數據文件、塊、行上。
(2).在重復的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重復記錄中那些具有最大rowid的就可以了,其餘全部刪除。
重復記錄判斷的標準是:
C1,C10和C20這三列的值都相同才算是重復記錄。
經查看錶CZ總共有16條記錄:
SQL>set pagesize 100
SQL>select * from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
2 3 che
2 3 che
2 3 che
3 4 dff
3 4 dff
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
20 rows selected.
1.查找重復記錄的幾種方法:
(1).SQL>select * from cz group by c1,c10,c20 having count(*) >1;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
(2).SQL>select distinct * from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
(3).SQL>select * from cz a where rowid=(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
2.刪除重復記錄的幾種方法:
(1).適用於有大量重復記錄的情況(在C1,C10和C20列上建有索引的時候,用以下語句效率會很高):
SQL>delete cz where (c1,c10,c20) in (select c1,c10,c20 from cz group by c1,c10,c20 having count(*)>1) and rowid not in
(select min(rowid) from cz group by c1,c10,c20 having count(*)>1);
SQL>delete cz where rowid not in(select min(rowid) from cz group by c1,c10,c20);
(2).適用於有少量重復記錄的情況(注意,對於有大量重復記錄的情況,用以下語句效率會很低):
SQL>delete from cz a where a.rowid!=(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
SQL>delete from cz a where a.rowid<(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
SQL>delete from cz a where rowid <(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
(3).適用於有少量重復記錄的情況(臨時表法):
SQL>create table test as select distinct * from cz; (建一個臨時表test用來存放重復的記錄)
SQL>truncate table cz; (清空cz表的數據,但保留cz表的結構)
SQL>insert into cz select * from test; (再將臨時表test里的內容反插回來)
(4).適用於有大量重復記錄的情況(Exception into 子句法):
採用alter table 命令中的 Exception into 子句也可以確定出庫表中重復的記錄。這種方法稍微麻煩一些,為了使用「excepeion into 」子句,必須首先創建 EXCEPTIONS 表。創建該表的 SQL 腳本文件為 utlexcpt.sql 。對於win2000系統和 UNIX 系統, Oracle 存放該文件的位置稍有不同,在win2000系統下,該腳本文件存放在$ORACLE_HOME\Ora90\rdbms\admin 目錄下;而對於 UNIX 系統,該腳本文件存放在$ORACLE_HOME/rdbms/admin 目錄下。
具體步驟如下:
SQL>@?/rdbms/admin/utlexcpt.sql
Table created.
SQL>desc exceptions
Name Null? Type
----------------------------------------- -------- --------------
ROW_ID ROWID
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
CONSTRAINT VARCHAR2(30)
SQL>alter table cz add constraint cz_unique unique(c1,c10,c20) exceptions into exceptions;
*
ERROR at line 1:
ORA-02299: cannot validate (TEST.CZ_UNIQUE) - plicate keys found
SQL>create table ps as select * from cz where rowid in (select row_id from exceptions);
Table created.
SQL>select * from ps;
C1 C10 C20
---------- ---------- ---
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
2 3 che
2 3 che
2 3 che
3 4 dff
3 4 dff
3 4 dff
16 rows selected.
SQL>select row_id from exceptions;
ROW_ID
------------------
AAAHD/AAIAAAADSAAA
AAAHD/AAIAAAADSAAB
AAAHD/AAIAAAADSAAC
AAAHD/AAIAAAADSAAF
AAAHD/AAIAAAADSAAH
AAAHD/AAIAAAADSAAI
AAAHD/AAIAAAADSAAG
AAAHD/AAIAAAADSAAD
AAAHD/AAIAAAADSAAE
AAAHD/AAIAAAADSAAJ
AAAHD/AAIAAAADSAAK
AAAHD/AAIAAAADSAAL
AAAHD/AAIAAAADSAAM
AAAHD/AAIAAAADSAAN
AAAHD/AAIAAAADSAAO
AAAHD/AAIAAAADSAAP
16 rows selected.
SQL>delete from cz where rowid in ( select row_id from exceptions);
16 rows deleted.
SQL>insert into cz select distinct * from ps;
3 rows created.
SQL>select *from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
7 rows selected.
從結果里可以看到重復記錄已經刪除。
Ⅳ sql資料庫中出現重復行數據,如何刪除這些重復記錄
示例
假設存在一個產品信息表Procts,其表結構如下:
CREATETABLEProcts(
ProctIDint,
ProctNamenvarchar(40),
Unitchar(2),
UnitPricemoney
)
表中數據如圖:
*fromProcts_tempdroptableProcts_temp
這樣就完成了對表中重復記錄的刪除。無論表有多大,它的執行速度都是相當快的,而且因為幾乎不用寫語句,所以它也是很安全的
Ⅳ left join 後,左表怎樣合並或者去掉重復記錄
在 MySQL 查詢中,可能會包含重復值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。 關鍵詞 DISTINCT 用於返回唯一不同的值,就是去重啦。用法也很簡單: SELECT DISTINCT * FROM tableName DISTINCT 這個關鍵字來過濾掉多餘的重復記錄只保留一條。 另外,如果要對某個欄位去重,可以試下: SELECT *, COUNT(DISTINCT nowamagic) FROM table GROUP BY nowamagic 這個用法,MySQL的版本不能太低。 在編寫查詢之前,我們甚至應該對過濾條件進行排序,真正高效的條件(可能有多個,涉到同的表)是查詢的主要驅動力,低效條件只起輔助作用。那麼定義高效過濾條件的准則是什呢?首先,要看過濾條件能否盡快減少必須處理的數據量。所以,我們必須倍加關注條件的寫方式。 假設有四個表: customers 、 orders 、 orderdetail 、 articles ,現在假設 SQL 要處理的問題是:找出最近六個月內居住在 Gotham 市、訂購了蝙蝠車的所有客戶。當然,編寫這個查詢有多種方法, ANSI SQL 的推崇者可能寫出下列語句: select distinct c.custname from customers c join orders o on o.custid = c.custid join orderdetail od on od.ordid = o.ordid join articles a on a.artid = od.artid where c.city = 'GOTHAM' and a.artname = 'BATMOBILE' and o.ordered >= somefunc 其中, somefunc 是個函數,返回距今六個月前的具體日期。注意上面用了 distinct ,因為考慮到某個客戶可以是大買家,最近訂購了好幾台蝙蝠車。 暫不考慮優化器將如何改寫此查詢,我們先看一下這段代碼的含義。首先,來自 customers 表的數據應只保留城市名為 Gotham 的記錄。接著,搜索 orders 表,這意味著 custid 欄位最好有索引,否則只有通過排序、合並或掃描 orders 表建立一個哈希表才能保證查詢速度。對 orders 表 ,還要針對訂單日期進行過濾:如果優化器比較聰明,它會在連接( join )前先過濾掉一些數據,從而減少後面要處理的數據量;不太聰明的優化器則可能會先做連接,再作過濾,這時在連接中指定過濾條件利於提高性能,例如: join orders o on o.custid = c.custid and a.ordered >= somefunc 注意,如果是: left outer join orders o on o.custid = c.custid and a.ordered >= somefunc 此處關於left表的篩選條件將失效,因為是左外連接,左表的所有列都將出現在這次連接結果集中)。 即使過濾條件與連接( join )無關,優化器也會受到過濾條件的影響。例如,若 orderdetail 的主鍵為( ordid, artid ),即 ordid 為索引的第一個屬性,那麼我們可以利用索引找到與訂單相關的記錄。但如果主鍵是( artid, ordid )就太不幸了(注意,就關系理論而言 ,無論哪個版本都是完全一樣),此時的訪問效率比( ordid, artid )作為索引時要差,甚至一些資料庫產品無法使用該索引(注 3 ),唯一的希望就是在ordid 上加獨立索引了。 連接了表 orderdetail 和 orders 之後,來看 articles 表,這不會有問題,因為表 order 包括 artid 欄位。最後,檢查 articles 中的值是否為 Batmobile 。查詢就這樣結束了,因為用了 distinct ,通過層層篩選的客戶名還必須要排序,以剔除重復項目。 避免在最高層使用 distinct 應該是一條基本規則 。原因在於,即使我們遺漏了連接的某個條件, distinct 也會使查詢 " 看似正確 " 地執行 —— 無可否認,發現重復數據容易,發現數據不準確很難,所以避免在最高層使用 distinct 應該是一條基本規則。 發現結果不正確更難,例如,如果恰巧有多位客戶都叫 " Wayne " , distinct 不但會剔除由同個客戶的多張訂單產生的重復項目,也會剔除由名字相同的不同客戶產生的重復項目。事實上,應該同時返回具唯一性的客戶 ID 和客戶名,以保證得到蝙蝠車買家的完整清單。 要擺脫 distinct ,可考慮以下思路:客戶在 Gohtam 市,而且滿足存在性測試,即在最近六個月訂購過蝙蝠車。注意,多數(但非全部) SQL 方言支持以下語法: select c.custname from customers c where c.city = 'GOTHAM' and exists (select null from orders o, orderdetail od, articles a where a.artname = 'BATMOBILE' and a.artid = od.artid and od.ordid = o.ordid and o.custid = c.custid and o.ordered >= somefunc ) 上例的存在性測試,同一個名字可能出現多次,但每個客戶只出現一次,不管他有多少訂單。有人認為我對 ANSI SQL 語法的挑剔有點苛刻(指 " 蝙蝠車買主 " 的例子),因為上面代碼中customers 表的地位並沒有降低。其實,關鍵區別在於,新查詢中 customers 表是查詢結果的唯一來源(嵌套的子查詢會負責找出客戶子集),而先前的查詢卻用了 join 。 這個嵌套的子查詢與外層的 select 關系十分密切。如代碼第 11 行所示(粗體部分),子查詢參照了外層查詢的當前記錄,因此,內層子查詢就是所謂的關聯子查詢( correlated subquery )。 此類子查詢有個弱點,它無法在確定當前客戶之前執行。如果優化器不改寫此查詢,就必須先找出每個客戶,然後逐一檢查是否滿足存在性測試,當來自 Gotham 市的客戶非常少時執行效率倒是很高,否則情況會很糟(此時,優秀的優化器應嘗試其他執行查詢的方式)。 select custname from customers where city = 'GOTHAM' and custid in (select o.custid from orders o, orderdetail od, articles a where a.artname = 'BATMOBILE' and a.artid = od.artid and od.ordid = o.ordid and o.ordered >= somefunc) 在這個例子中,內層查詢不再依賴外層查詢,它已變成了非關聯子查詢( uncorrelated subquery ),只須執行一次。很顯然,這段代碼採用了原有的執行流程。在本節的前一個例子 中 ,必須先搜尋符合地點條件的客戶(如均來自 GOTHAM ),接著依次檢查各個訂單。而現在,訂購了蝙蝠車的客戶,可以通過內層查詢獲得。 不過,如果更仔細地分析一下,前後兩個版本的代碼還有些更微妙的差異。含關聯子查詢的代碼中,至關重要的是 orders 表中的 custid 欄位要有索引,而這對另一段代碼並不重要,因為這時要用到的索引(如果有的話)是表 customers 的主鍵索引。 你或許注意到,新版的查詢中執行了隱式的 distinct 。的確,由於連接操作,子查詢可能會返回有關一個客戶的多條記錄。但重復項目不會有影響,因為 in 條件只檢查該項目是否出現在子查詢返回的列表中,且 in 不在乎某值在列表中出現了一次還是一百次。但為了一致性,作為整體,應該對子查詢和主查詢應用相同的規則,也就是在子查詢中也加入存在性測試: select custname from customers where city = 'GOTHAM' and custid in (select o.custid from orders o where o.ordered >= somefunc and exists (select null from orderdetail od, articles a where a.artname = 'BATMOBILE' and a.artid = od.artid and od.ordid = o.ordid)) 或者 select custname from customers where city = 'GOTHAM' and custid in (select custid from orders where ordered >= somefunc and ordid in (select od.ordid from orderdetail od, articles a where a.artname = 'BATMOBILE' and a.artid = od.artid) 盡管嵌套變得更深、也更難懂了,但子查詢內應選擇 exists 還是 in 的選擇規則相同:此選擇取決於日期與商品條件的有效性。除非過去六個月的生意非常清淡,否則商品名稱應為最有效的過濾條件,因此子查詢中用 in 比 exists 好,這是因為,先找出所有蝙蝠車的訂單、再檢查銷售是否發生在最近六個月,比反過來操作要快。如果表 orderdetail 的 artid 欄位有索引,這個方法會更快,否則,這個聰明巧妙的舉措就會黯然失色。 每當對大量記錄做存在性檢查時,選擇 in 還是 exists 須斟酌。 利於多數 SQL 方言,非關聯子查詢可以被改寫成 from 子句中的內嵌視圖。然而,一定要記住的是, in 會隱式地剔除重復項目,當子查詢改寫為 from 子句中的內嵌視圖時,必須要顯式地消除重復項目。例如: select custname from customers where city = 'GOTHAM' and custid in (select o.custid from orders o, (select distinct od.ordid from orderdetail od, articles a where a.artname = 'BATMOBILE' and a.artid = od.artid) x where o.ordered >= somefunc and x.ordid = o.ordid) 總結:保證 SQL 語句返回正確結果,只是建立最佳 SQL 語句的第一步。
Ⅵ SQL資料庫查詢去除重復的關鍵字是什麼
distinct 關鍵字可從 select 語句的結果中消除重復的行。如果沒有指定 distinct,將返回所有行,包括重復的行。
資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。
資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型資料庫系統都在各個方面得到了廣泛的應用。
在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。資料庫技術是管理信息系統、辦公自動化系統、決策支持系統等各類信息系統的核心部分,是進行科學研究和決策管理的重要技術手段。
資料庫,簡單來說是本身可視為電子化的文件櫃--存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
資料庫指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能小的冗餘度的特點、是與應用程序彼此獨立的數據集合。
在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的"倉庫",並根據管理的需要進行相應的處理。
例如,企業或事業單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個資料庫。
有了這個"數據倉庫"我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。
此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種"資料庫",使其可以利用計算機實現財務、倉庫、生產的自動化管理。
Ⅶ SQL資料庫刪除重復行保留一條記錄,怎麼寫謝謝哦
刪除重復,保留最小id
delete from table where exists (select 1 from table t1 where t1.重復欄位 = table.重復欄位 and t1.id < table.id )
-----------看成是一個循環,從表第一行到最後一行,如果存在比本行ID小的重復數據,那麼刪除本行。這樣循環後的最終結果就是保留了最小ID的一行。
保留最大也是同理
delete from table where exists (select 1 from table t1 where t1.重復欄位 = table.重復欄位 and t1.id > table.id )
---------一個循環,從第一行到最後一行,如果存在ID比本行大的重復數據,刪除本行,最後剩下的都是不重復的且ID是最大的記錄。
Ⅷ 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 [去除重復的欄位名列表,....])
(8)資料庫消除車重復行擴展閱讀:
SQL Server 是Microsoft 公司推出的關系型資料庫管理系統。具有使用方便可伸縮性好與相關軟體集成程度高等優點,可跨越從運行Microsoft Windows 98 的膝上型電腦到運行Microsoft Windows 2012 的大型多處理器的伺服器等多種平台使用。
Microsoft SQL Server 是一個全面的資料庫平台,使用集成的商業智能 (BI)工具提供了企業級的數據管理。Microsoft SQL Server資料庫引擎為關系型數據和結構化數據提供了更安全可靠的存儲功能,使您可以構建和管理用於業務的高可用和高性能的數據應用程序。
Ⅸ 資料庫刪除內容重復的行(除主鍵ID之外其他列值都相同)
如果ID沒有和其他表關聯
那就select
distinct
其他欄位到臨時表
然後刪除原表
把臨時表的記錄insert進來就可以
Ⅹ 如何刪除sybase表中的重復行
刪除sybase表中的重復行方法如下:
1)select distinct a ,b,c,d … into tempdb..tmp_tablename from tablename
然後清空原表,把臨時表中的數據插入正式表中!
2)創建相同的表並建一個唯一性索引:create unique index(列名1,列名2…) on tmp_tab with ignore_p_key
insert into new_tab select * from your_p_tab
新表中將自動刪出重復記錄。