删除两个表之间的重复行

时间:2018-08-24 06:02:09

标签: mysql

t1-列:titlestory
t2-列:titlestory

两个表之间有些行重复,即titlestory的值相同。

需要从t2删除该行,并将其余行从t2移到t1;

有帮助吗?

3 个答案:

答案 0 :(得分:3)

首先从t2中删除重复的记录:

DELETE
FROM t2
WHERE EXISTS (SELECT 1 FROM t1 WHERE t2.title = t1.title AND t2.story = t1.story);

最后,将唯一记录从t2插入t1

INSERT INTO t1 (title, story)
SELECT title, story
FROM t2;

答案 1 :(得分:1)

-- Create temporary table
CREATE TABLE temp_t LIKE t1;

-- Add constraint
ALTER TABLE temp_t ADD UNIQUE(title, story);

-- Copy data
INSERT IGNORE INTO temp_t SELECT * FROM t1;
INSERT IGNORE INTO temp_t SELECT * FROM t2;

-- copy back and drop temp ( if you dont want these constraints on t1 table)
TRUNCATE TABLE t1;
INSERT INTO t1 SELECT * FROM temp_t;
DROP TABLE temp_t;

-- rename and drop ( if you want these constraints on t1 table)
RENAME TABLE t1 TO old_t1, temp_t TO t1;
DROP TABLE old_t1;

答案 2 :(得分:0)

我看到问题被标记为mysql,我的答案使用linux命令行,vi和您选择的编程语言,但这是执行您想要的技术:

第1步-将t1和t2这两个表都排序为t1sorted和t2sorted;

步骤2-删除重复项-排序后(如果表未排序,则排序步骤不起作用,排序方向的升/降不相关),只需对每个表进行一次迭代,将当前行与上一行进行比较,然后跳过当前行如果与前一行相同则行;您可以编写一个简单的程序以您喜欢的语言(例如C)来执行此操作;输出到t1sorted_dupesremoved和t2sorted_dupesremoved;

第3步-现在,您可以找到t1sorted_dupesremoved中不存在t2sorted_dupesremoved中的哪些行,因此您可以将它们添加到t1sorted_dupesremoved中,如下所示:(假设linux命令行-grep \ <仅显示t1中不存在的t2中的行并在>之后将它们重定向到输出文件,请注意,如果存在,此输出文件将被覆盖):

diff t2sorted_dupesremoved t1sorted_dupesremoved | grep \< > t2lines_not_in_t1

第4步-现在,您需要使用喜欢的编辑器(例如vi)来编辑输出文件t2lines_not_in_t1,以删除diff在每行开头插入的<和多余的空格;那么您可以在t1的末尾将其连接起来,如下所示:

第5步-

cat t2lines_not_in_t1 >> t1sorted_dupesremoved 

请注意使用double >>在t1的末尾添加t2-非常重要,单个>会覆盖t1!

第6步-现在您可以对已删除的t1sorted_dupes进行排序了!您将t1和t2中的每个唯一行的一个实例按一个文件的顺序排序;