INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,max(c),max(d),max(e),max(f)
FROM source_table
GROUP BY a,b;
作为替代方案(例如当某些列被定义为CLOB或LONG,并且不能对它们应用max()时):
INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,c,d,e,f
FROM (
SELECT a,b,c,d,e,f,
row_number() over (partition by a,b) as rn
FROM source_table
)
WHERE rn = 1;
如果您确实希望首先删除行,可以使用以下语句执行此操作:
DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
FROM source_table
GROUP BY a,b
HAVING count(*) > 1)
SELECT BT.NAME, BT.LOCATION
FROM SO_BUFFER_TABLE_7 BT,
(SELECT BT.NAME, BT.LOCATION, MAX(ROWID) AS UNQ
FROM SO_BUFFER_TABLE_7 BT
GROUP BY BT.NAME, BT.LOCATION
HAVING COUNT(*) > 1) A
WHERE BT.ROWID <> A.UNQ
AND BT.NAME = A.NAME
AND BT.LOCATION = A.LOCATION
我喜欢@a_horse_with_no_name的答案,但得到了一个错误 [HY000][1093] You can't specify target table 'example' for update in FROM clause 我用这个resource来扩展答案。我需要删除重复的行,因为这将是使用MySQL通过唯一复合索引(键)包含列的前兆。
DELETE FROM wp_example_table_name
WHERE (user_id1, user_id2) in (SELECT * FROM (SELECT user_id1, user_id2
FROM wp_example_table_name
GROUP BY user_id1, user_id2
HAVING COUNT(*) > 1) tmp)
4条答案
按热度按时间hl0ma9xz1#
你有两个选择:
1.在复制源表之前删除源表中的重复项
1.一开始就不要复制副本。
第二个更有效,可以使用以下语句完成:
作为替代方案(例如当某些列被定义为
CLOB
或LONG
,并且不能对它们应用max()时):如果您确实希望首先删除行,可以使用以下语句执行此操作:
643ylb082#
1.消除重复记录的最简单方法是SELECT DISTINCT到临时表中,截断原始表,然后SELECT记录回到原始表中。详细信息here。
brccelvz3#
假设我有这样的数据
这里user1(3)和user2(1)有重复的记录。
此查询将只显示重复情况下的记录。因此,user1的记录不是3条,而是2条
结果为
您可以用DELETE替换SELECT来删除重复的记录。
希望能帮上忙
6rqinv9w4#
我喜欢@a_horse_with_no_name的答案,但得到了一个错误
[HY000][1093] You can't specify target table 'example' for update in FROM clause
我用这个resource来扩展答案。我需要删除重复的行,因为这将是使用MySQL通过唯一复合索引(键)包含列的前兆。