2015-10-09 39 views
2

如何使用SQL删除给定表中的冗余记录?如何删除给定表中的冗余记录,使用SQL

FROM | TO  | TIME 
======================== 
USA | CHINA | 4 
USA | AFRICA | 2 
CHINA | USA  | 4 
CALI | NEWZLND | 3 

这里美国到中国&中国到美国是多余的记录,我只需要其中的一个是在决赛桌。我怎样才能为这个词组的SQL查询?

+0

你能告诉我们你有表,任何事情你到目前为止已经试过,任何代码,我们可以帮助您?其他任何其他最终结果? – Veljko89

+1

请不要张贴图片。更好地发布我们可以复制和粘贴的内容。否则,我们很难帮助你。 – Shnugo

回答

0

试试看这个。

小提琴:http://sqlfiddle.com/#!9/c3211/2

BTW:改变你的列名。不要使用像,TO和时间保留的话......

CREATE TABLE tbl(FromColumn VARCHAR(100),ToColumn VARCHAR(100),TIMEColumn INT); 

INSERT INTO tbl VALUES 
('USA','CHINA',4) 
,('USA','AFRICA',2) 
,('CHINA','USA',4) 
,('CALI','NEWZLND',3); 

SELECT * 
FROM tbl AS tbl 
WHERE (SELECT COUNT(*) 
     FROM tbl AS x 
     WHERE x.FromColumn>x.ToColumn 
     AND x.FromColumn=tbl.ToColumn 
     AND x.ToColumn=tbl.FromColumn 
     AND x.TIMEColumn=tbl.TIMEColumn 
     )=0; 
-1

听起来好像你有一种自反的关系,类似于“Person1是Person2的朋友” - 它暗示着“Person2是Person1的朋友”,并且你不想存储这两个记录。假设你存储哪一个并不重要,你可以删除重复项。在这里,我保留Person1在Person2之前出现的那个:

CREATE TABLE Friendship(
    Person1  varchar(128), 
    Person2  varchar(128), 
    PRIMARY KEY(Person1, Person2) 
); 

DELETE FROM Friendship 
WHERE EXISTS(
    SELECT * 
    FROM Friendship as reflex 
    WHERE Friendship.Person1 = reflex.Person2 
     AND Friendship.Person2 = reflex.Person1 
     AND Friendship.Person2 < Friendship.Person2 
);  
+0

对不起,我错过了你的形象(你没有标题),但我的解决方案仍然通过删除多余的记录来解决你的问题。你也可以用SELECT做同样的事情。 – cliffordheath