1樓:拯救夢想
這問題最棘手的地方是沒有主鍵。
對於表中有內部行 id 的資料庫,比如 Oracle,可以在去重後保留最大行 id 或者最小行 id 的記錄。對於沒有內部行 id 支援的資料庫,操作起來會麻煩一點,我們以 MySQL 資料庫為例。
第一種方法,生成自增的唯一 id。
ALTER
TABLE
`student
`ADD
COLUMN`id
`INT
NOTNULL
AUTO_INCREMENT
AFTER
`address`,
ADDKEY(`
id`);DELETEa.
*FROM
studentASa
INNER
JOIN
studentASb
ONb.name=a
.name
ANDb
.age=a
.age
ANDb
.address=a
.address
ANDa.id
>b.
id;如果我們不能在原表上新增字段,那可以試試下面的其它方法。
第二種方法,借用臨時表。
CREATE
TABLE
student_new
SELECT
DISTINCT
NAME
,age
,address
FROM
student
;DROP
TABLE
student
;RENAME
TABLE
student_new
student
;匯入去重後的資料到新的表中;
將新錶重新命名成原表的名稱。
第三種方法,使用使用者變數。
SET@
num:=0
,@name:=
'',@age:=
NULL,@
address:=
'';DELETE
FROM
student
WHERE
GREATEST(0
,@num:=IF
(NAME=@
name
ANDage=@
ageAND
address=@
address,@
num+1,
0),LEAST(0
,LENGTH(@
name:=
NAME),@
age:
=age
,LENGTH(@
address:=
address
)))>
0ORDER
BYNAME
,age
,address
;這種方式可能有點難於理解,該 SQL 大致的處理流程如下:
先對表中的資料按照 name,age,address 這三個字段排序,保證重複的資料是相鄰的;
給所有資料行編號,沒有出現重複資料的行的編號都為 0;對於有重覆記錄的資料,先出現的資料的行的編號是 0,後面出現的資料的編號按順序遞增;
刪掉編號大於 0 的資料。
LEAST(0, LENGTH(@name := NAME),@age := age,LENGTH(@address :
= address)) 的作用就是把當前行的幾個欄位的值暫存到使用者變數,方便下一行的資料呼叫。
2樓:頹然回首
我看到有人回答用「distinct」了。我個人是覺得這個足以實現去重了,不過題主非要求只保留重複行的第一行是為了什麼?明明幾行完全一樣啊
3樓:
sql - How can I remove duplicate rows?
;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY name, age, address
ORDER BY ( SELECT 0)) RNFROM student)
DELETE FROM cte
WHERE RN > 1
4樓:
SQL去重都問到知乎來了 。。
輪子哥說這樣啊比較麻煩
create table tab_0608bak as select distinct name, age, address from tab;
truncate table tab;
insert into tab select * from tab_0608bak;
oracle可以用rowid把
delete from tab a where a.rowid != (select max(rowid) from tab b
where a.name = b.nameand a.age = b.age
and a.address = b.address);
postgres 可以用ctid
用法同上。
mysql不知道。沒用過
5樓:
我的辦法比較土:
select distinct xxoo from (select *,name&"+"&age&"+"&address as xxoo from student)
6樓:Jim Cen
SELECT name,age,address
FROM student
GROUP BY name,age,address
7樓:zinc chong
select distinct name,age,address from tbl
哦,原來有指定表名的呀,那就換吧,習慣用tbl代替任何乙個資料問題表了
這個python問題如何解決
盜藍 只返回第乙個最長的數字字串 import re string 983fh398fh29q83u9283f9299h3 int list re findall r d string int list 983 398 29 83 9283 9299 3 result max int list ke...
如何解決這個數學問題?
瑜書 剛發現可以有乙個更為簡潔的寫法,更新一波 以上兩式不等號僅在x 1時成立。另外,對斐波那契數列,有 由 1 和 2 可以得到 由 1 和 3 有 log a Leftrightarrow ln 2 frac ln a cdot ln fraca eeimg 1 由 4 frac eeimg 1...
農民不種地了,這個問題如何解決?
巨浪塵埃 現在有兩個工作在你面前,乙個每月2000的工資不包括吃住,另乙個每月5000也不包括吃住,你肯定選每月5000的,如果工資是2000萬和5000萬你不一定會選5000萬的工作,因為2000可能都保障不了生活,但是2000萬和5000萬都不會面臨這些問題。 本人來自農村,家裡現在還有地在種,...