2017-04-27 117 views
4

我在桌上稱爲距離。它有4列。 id,start_from,end_todistance查詢從SQL中刪除重複項

我有一些重複記錄。重複的記錄在這個意義上,

start_from | end_to | distance 
Chennai  Bangalore  350 
Bangalore  Chennai  350 
Chennai  Hyderabad  500 
Hyderabad  Chennai  510 

在上表中,奈班加羅爾班加羅爾奈都有相同的距離。所以我需要查詢刪除該記錄選擇

我要出去放像

start_from | end_to | distance 
Chennai  Bangalore  350 
Chennai  Hyderabad  500 
Hyderabad  Chennai  510 
+1

請分享確切的期望輸出。字段值可能會重複,但根據要求,我們需要重寫查詢或重新設計表格。 –

+0

@SaurabhJhunjhunwala添加了所需的輸出。我無法改變桌子。 – shiva

+0

爲什麼你要**欽奈** **班加羅爾**,而不是**班加羅爾** **欽奈**?如果** Chennai **到** Hyderabad **也是350,那麼您會想要什麼? – Blank

回答

2

如果Chennai to BangaloreBangalore to Chennai之間沒有什麼不同,你可以試試這個:

select 
    max(`start_from`) as `start_from`, 
    min(`end_to`) as `end_to`, 
    `distance` 
from yourtable 
group by 
    case when `start_from` > `end_to` then `end_to` else `start_from` end, 
    case when `start_from` > `end_to` then `start_from` else `end_to` end, 
    `distance` 

這裏是一個rextester demo。即使Chennai to Hyderabad是350也可以工作demo

如果你想Bangalore to Chennai將依然存在,你可以改變的maxmin的地方:

select 
    min(`start_from`) as `start_from`, 
    max(`end_to`) as `end_to`, 
    `distance` 
from yourtable 
group by 
    case when `start_from` > `end_to` then `end_to` else `start_from` end, 
    case when `start_from` > `end_to` then `start_from` else `end_to` end, 
    `distance` 

demo

case when將與大多數數據庫兼容。

+0

是的,你是對的。它看起來更好與案件和時間 – shiva

0

設置字段順序查詢(使用值)有助於獲得一個唯一行:

select distinct 
    case when start_from > end_to then end_to  else start_from end as _start, 
    case when start_from > end_to then start_from else end_to  end as _end, 
    distance 
from distance; 

測試後,我得到:

+-----------+-----------+----------+ 
| _start | _end  | distance | 
+-----------+-----------+----------+ 
| Bangalore | Chennai |  350 | 
| Chennai | Hyderabad |  500 | 
| Chennai | Hyderabad |  510 | 
+-----------+-----------+----------+ 
+0

但是最後一行應該是'海得拉巴,欽奈,510' – Wanderer

+0

是的,好的一個通過使用值排序字段,然後篩選唯一的記錄。但正如@Ullas提到*** start_from ***改變了 – shiva

2

您可以使用以下查詢來查找重複項:

SELECT LEAST(start_from, end_to) AS start_from, 
     GREATEST(start_from, end_to) AS end_to, 
     distance 
FROM mytable 
GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance 
HAVING COUNT(*) > 1 

輸出:

start_from, end_to, distance 
-------------------------------- 
Bangalore, Chennai, 350 

現在你可以使用上面的查詢作爲派生表過濾掉重複:

SELECT t1.* 
FROM mytable AS t1 
LEFT JOIN (
    SELECT LEAST(start_from, end_to) AS start_from, 
      GREATEST(start_from, end_to) AS end_to, 
      distance 
    FROM mytable 
    GROUP BY LEAST(start_from, end_to), GREATEST(start_from, end_to), distance 
    HAVING COUNT(*) > 1 
) AS t2 ON t1.start_from = t2.start_from AND 
      t1.end_to = t2.end_to AND 
      t1.distance = t2.distance  
WHERE t2.start_from IS NULL 

WHERE從句謂語,t2.start_from IS NULL,過濾掉重複記錄。

輸出:

start_from end_to  distance 
-------------------------------- 
Chennai  Bangalore 350 
Chennai  Hyderabad 500 
Hyderabad Chennai 510 
0

假設你的表像

id start_from    end_to     distance 
0 Chennai     Bangalore    350 
1 Bangalore    Chennai     350 
2 Chennai     Hyderabad    500 
3 Hyderabad    Chennai     510 

然後你就可以使用查詢與ID進行比較。

Select 
    O.start_from, 
    O.end_to, 
    O.distance 
From 
    distance O 
Left Join 
    distance P 
On 
    1 = 1 
    and O.start_from = P.end_to 
    and O.end_to = P.start_from 
Where 
    1 = 1 
    and O.distance <> P.distance 
    or(O.distance = P.distance and O.id < P.id) 
+0

'CASE'與'JOIN'。 ** CASE **更好。所以最好使用***'CASE' *** – shiva