我正在使用SQLite使用两列u和v来存储图形的一组无向边缘。例如:
你v
1 2
3 2
2 1
3 4
我已经使用了SELECT DISTINCT * FROM edge并删除了所有重复的行。
然而,如果我们记住这些是无向边缘,仍然有重复。在上面的例子中,边(1,2)出现两次,一次为(1,2),一次为(2,1),两者都是等价的。
我希望删除所有这些副本,只留下其中一个,(1,2)或(2,1) - 这并不重要。
任何想法如何实现这一目标?谢谢!
答案 0 :(得分:6)
如果存在相同的对(反向),请使用u> v。
SELECT DISTINCT u,v
FROM table t1
WHERE t1.u > t1.v
OR NOT EXISTS (
SELECT * FROM table t2
WHERE t2.u = t1.v AND t2.v = t1.u
)
答案 1 :(得分:4)
这将找到所有重复项:
SELECT t1.u, t1.v FROM table t1 INNER JOIN table t2
ON t1.u = t2.v AND t1.v = t2.u
这将删除重复项:
DELETE FROM table t1 WHERE
EXISTS (SELECT * FROM table t2 WHERE t2.u = t1.v AND t2.v = t1.u AND t1.u > t2.u)
请注意,这不会删除像(2,2)这样的重复项,但我认为你已经使用了SELECT DISTINCT。
答案 2 :(得分:-2)
- 测试9个数字,以便我在两个表中添加9个数字
declare @num int
set @num =1
while @num<10
begin
insert into t2 values (@num)
insert into t1 values (@num)
set @num += 1
end
- 然后在不重复的情况下耦合唯一身份
select t1.u, t2.v
from t1 cross join t2
where t1.u>t2.v