SQL:根据某些列排列排除重复的行

SQL: exclude rows that are duplicates according to some column arrangement

在我的问题中,我有这些行,例如:

    id1  |name1| id2 | name2| c 
1   10994,Apple,22265,Banana,103
2   22265,Banana,10994,Apple,103
3   20945,Coconut,20391,Date,101
4   20391,Date,20945,Coconut,101

它们显示 ID 和名称的成对组合,以及另一列 c

考虑到 ID 和名称的配对,我认为第 1+2 行和第 3+4 行是重复的。第 1+2 行或第 3+4 行显示的信息基本相同。

我没能通过分组删除重复项,因为 id1 + id2 或 name1 + name2 分别是不同的列。

我可以在我的 SQL 查询中添加一些内容来删除这些 'duplicates',以便只输出第 1+3 行吗?

您可以尝试使用不存在。您没有提供任何现有的查询,而是类似于:

select *
from Tablename t
where not exists (
  select * from Tablename t2
  where t2.id2 = t.id1
);

这里的一种方法是按 c 列进行聚合,然后使用 least/greatest 技巧来梳理重复项。这是一个通用解决方案,适用于任何版本的 SQL:

SELECT DISTINCT c, CASE WHEN id1 < id2 THEN id1 ELSE id2 END AS id1,
                   CASE WHEN id1 < id2 THEN id2 ELSE id1 END AS id2,
                   CASE WHEN name1 < name2 THEN name1 ELSE name2 END AS name1,
                   CASE WHEN name1 < name2 THEN name2 ELSE name1 END AS name2
FROM yourTable;

这是一个有效的 demo

请注意,在具有 LEASTGREATEST 函数的数据库上,上述内容可以简化为:

SELECT DISTINCT c, LEAST(id1, id2) AS id1,
                   GREATEST(id1, id2) AS id2,
                   LEAST(name1, name2) AS name1,
                   GREATEST(name1, name2) AS name2
FROM yourTable;