用于删除行间重复项的SQL查询

时间:2017-05-03 10:16:25

标签: sql

我有一张表格如下:

City1 City2 Distance
A      B     500
C      D     400
E      F     800
F      E     800

我的输出应该如下:

City1 City2 Distance
A      B     500
C      D     400
E      F     800

你能帮我写一个sql吗?

城市秩序无关紧要。只需要一个独特的组合。 这里(F,E,800)也将在最终输出中进行。

4 个答案:

答案 0 :(得分:1)

您可能希望删除任意两个城市的重复对,无论这些城市的显示顺序如何。不清楚的是您希望保留哪个Distance值。假设您可以保留最大距离,可以尝试以下查询:

SELECT
    CASE WHEN City1 < City2 THEN City1 ELSE City2 END AS City1,
    CASE WHEN City2 < City1 THEN City1 ELSE City2 END AS City2,
    MAX(Distance) AS Distance
FROM yourTable
GROUP BY
    CASE WHEN City1 < City2 THEN City1 ELSE City2 END,
    CASE WHEN City2 < City1 THEN City2 ELSE City1 END

请注意,我尽可能地给出了答案,因为您从未告诉我们您使用的是哪个版本的SQL。这个查询可以在MySQL,Postgres和其他几个方面进行一些简化。

以下是MySQL中正在运行的演示:

Rextester

答案 1 :(得分:0)

;

WITH cte
AS (
SELECT ROW_NUMBER() OVER (
        PARTITION BY /* based on what? can be multiple columns*/
        ORDER BY (
                SELECT 0
                )
        ) RN
FROM yourtable
)
DELETE
FROM cte
WHERE RN > 1

答案 2 :(得分:0)

使用case表达式始终将第一个城市放在第一列,将最后一个城市放在第二列。然后执行SELECT DISTINCT删除重复的行:

select distinct case when City1 < City2 then City1 else City2 end,
                case when City1 > City2 then City1 else City2 end,
                distance
from tablename

答案 3 :(得分:0)

一种适用于数据库的方法可以保证输出中唯一的值在原始表中是使用union all

select t.*
from t
where city1 < city2
union all
select t.*
from t
where city1 > city2 and
      not exists (select 1
                  from t t2
                  where t2.city1 = t1.city2 and t2.city2 = t1.city1
                 );

请注意,如果表格中有重复项,则应使用union而不是union all。此外,如果距离不同,您可能需要考虑距离。