2015-02-06 58 views
0

在MySQL鏡像列的去重排,假設我有一個名字和姓氏的表,使用SQL

FName - LName 
John - Paul 
Paul - John 
Alice - Peter 
Peter - Alice 

所以,如果你看到的每一行都會有重複的條目,但在相反的。

我想,只有行的一個選擇爲每個唯一進入這樣的方式來選擇行(無所謂哪一個)。

我得到的表應該是這樣的:

FName - LName 
John - Paul 
Peter - Alice 

有不止一個正確的結果,但我希望你得到了點。

在此先感謝!

+0

是與2個值一列由連字符或2列(FNAME/L-NAME)中分離? – 2015-02-07 00:48:40

+0

它*應該*重要! – Strawberry 2015-02-07 01:15:23

回答

1
SELECT DISTINCT 
     least(fName, lName) fName, 
     greatest (FName, lName) lName 
    FROM table 

這樣做。你的名字將出現在collat​​ino中相關的姓氏之前。

+0

演示:http://www.sqlfiddle.com/#!2/28db2/2 – Barmar 2015-02-06 23:57:11

+0

哇!這是一個很棒的技巧..謝謝! – Maverickgugu 2015-02-07 14:38:57

0

嘗試以下,假設總有2次重複,沒有更多的,毫不遜色:

這是假設你的表中有一個連字符分隔的兩個值一列。

小提琴:http://sqlfiddle.com/#!2/c04fae/2/0

select 
    min(col_lr) as de_duplicated 
from 
    (
     select 
     x.col as col_lr, 
     count(y.col) + count(z.col) as grp 
     from 
     tbl x 
     left join tbl y on x.col < y.col 
     left join tbl z on concat(right(x.col, length(x.col) - locate(' - ', x.col) - 2), ' - ', substr(x.col, 1, locate(' - ', x.col) - 1)) < z.col 
     group by 
     x.col 
    ) x 
group by 
    grp 

它建立在ABC順序的複合秩(用於左到右,和從右到左)在表中,賦予該組值相同的兩個複製的行,在這一點上,你可以選擇兩個中的第一個。