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。
请注意,在具有 LEAST
和 GREATEST
函数的数据库上,上述内容可以简化为:
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;
在我的问题中,我有这些行,例如:
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。
请注意,在具有 LEAST
和 GREATEST
函数的数据库上,上述内容可以简化为:
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;