⑴ 在sql中一張表中有重復的幾行,怎麼刪掉重復的,但是只保留一行!
SQL Server 的處理辦法
-- 首先創建測試表
CREATE TABLE test_delete(
name varchar(10),
value INT
);
go
-- 測試數據,其中 張三100 與 王五80 是完全一樣的
INSERT INTO test_delete
SELECT '張三', 100
UNION ALL SELECT '張三', 100
UNION ALL SELECT '李四', 80
UNION ALL SELECT '王五', 80
UNION ALL SELECT '王五', 80
UNION ALL SELECT '趙六', 90
UNION ALL SELECT '趙六', 70
go
-- 首先查詢一下, ROW_NUMBER 效果是否滿足預期
SELECT
ROW_NUMBER() OVER (PARTITION BY name, value ORDER BY (SELECT 1) ) AS no,
name,
value
FROM
test_delete
no name value
----- ---------- -----------
1 李四 80
1 王五 80
2 王五 80
1 張三 100
2 張三 100
1 趙六 70
1 趙六 90
從結果上可以看到,如果有重復的,完全一樣的話, no 是有大於1的。
-- 創建視圖
CREATE VIEW tmp_view AS
SELECT
ROW_NUMBER() OVER (PARTITION BY name, value ORDER BY (SELECT 1) ) AS no,
name,
value
FROM
test_delete
-- 刪除 視圖中的 no 不等於 1 的數據。
1> DELETE FROM tmp_view WHERE no != 1
2> go
(2 行受影響)
1>
2> select * from test_delete;
3> go
name value
---------- -----------
張三 100
李四 80
王五 80
趙六 90
趙六 70
(5 行受影響)
結果看上去是滿足預期的。
⑵ sql 如何使交叉相等的數保留一行
兩種方法:
一種是用去重DISTINCT關鍵字,搜索的時候Select DISTINCT name 就好了,不推薦,效率太低
第二種是邏輯分析,重復實際上是重復連接了,多加下條件就好了,比如
select * from X t left join X tt on t.id < tt.id
⑶ SQL: 刪除一個列中重復的數據,但保留一行。假設 表A的列B 有三個a ,要求刪除2個,保留1個!!!
這個是SQL中distinct的典型用法:
1)從字面意思就可以了解到:
distinct [dis'tiŋkt] adj. 明顯的;獨特的;清楚的;有區別的
2)在SQL中用distinct來消除重復出現的欄位值。
使得每個欄位值只出現一次。
具體用法如下:
select distinct 欄位名 from 表;
distinct 欄位名 意思就是只顯示一次該欄位名
一般情況下和order by 結合使用,這樣可以提高效率。
所以你這個問題的答案是:select distinct B from A;
希望我的回答能讓您滿意。
⑷ SQL Server 刪除所有重復行數據,只保留一行記錄,沒有主鍵
裡面有一個distinct,就是消除重復行的,如果你是想看的時候,重復的只留一行,而不是刪除裡面的數據的話,那麼就是寫selectdistinctidfrompersons或者selectidfrompersonsgroupbyid如果你是想刪除表裡面的相同行,那麼就是deletefr
⑸ sql問題,(a,b),(b,a)類型的數據只保留一行
建議你這樣試試看:
select distinct (case when v1 <= v2 then v1 else v2 end) as v1,(case when v1 <= v2 then v2 else v1 end) as v2 from 表名
測試效果:
⑹ sql語句刪除重復數據,保留一行
delete from tab where ROWID IN (
SELECT ROWID FROM (SELECT RANK()OVER(PARTITION BY 重復欄位 ORDER BY ROWID) t
FROM tab WHERE 重復欄位 IN (select name1 from tab group by 重復欄位 HAVING COUNT(重復欄位)>1)) WHERE t>1);
⑺ sql刪除重復數據且只保留一條
在你的查詢sql裡面將子查詢的title改成id,外面用id in(),這樣會得到去重後的數據導出insert語句,將表中數據備份刪除,再將導出的sql執行一下即可,還有一種就是寫刪除sql,delete from table where id not in(select id from table group by title )。
⑻ SQL 如何刪除重復記錄重復記錄只保留一行
----注意,執行前,一定先備份,執行後查看是否是你要的效果
----在這里按你的要求,只保留「EmpID,FDate,fdate1」相同的記錄中,ID值最小的記錄
DELETEEmpdiaoWHEREIDNOTIN(
SELECTMIN(id)ASID
FROMEmpdiao
GROUPBYEmpID,FDate,fdate1
)
⑼ 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語句: