如何解決這個SQL問題?

時間 2021-05-13 00:15:12

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萬都不會面臨這些問題。 本人來自農村,家裡現在還有地在種,...