将行从一个表插入另一个表,但只插入那些没有重复的行

时间:2016-06-02 06:55:35

标签: mysql sql

我见过thisthisthisthisthis,但我的问题不同了。

我有一个表1:

id c a b rc bid
1 12 4 6 35 4 
2 12 4 6 67 7
3 12 4 6 88 8
4 23 4 7 49 3
5 23 5 8 59 8

Table2也有相同的列,但没有bid列。

如果行具有相同的列cab值,则会将其视为重复行。因此,行1,2和3被认为是重复的,因为它们有12,4和6。

我想将Table1行插入Table2,但只插入那些不重复的行。 这意味着第1,2和3行不会插入Table2 。只插入第4行和第5行,因为它们没有重复项。

因此,插入后Table2将如下所示:

id c a b rc
1 23 4 7 49
2 23 5 8 59

我知道我可以使用此查询获取哪些行没有重复:

select distinct c,a,b,count(*) from Table1 group by c,a,b having count(*) > 1

但我无法弄清楚如何将这些插入Table2,因为插入需要指定特定的列。

尝试过类似的东西,这显然不起作用:

insert into Table2 (c, a, b, rc) select distinct c,a,b,count(*) from Table1 group by c,a,b having count(*) > 1

4 个答案:

答案 0 :(得分:2)

您也可以在子选择中使用

INSERT INTO Table2(c, a, b, rc, bid)
SELECT  c, a, b, rc, bid
FROM Table1 t1
WHERE (c,a,b) not in ( SELECT c,a,b 
      FROM Table1 t2
      GROUP BY c, a, b
     HAVING COUNT(*) > 1
 )

答案 1 :(得分:1)

您可以使用NOT EXISTS排除重复的行:

INSERT INTO Table2(c, a, b, rc, bid)
SELECT
    c, a, b, rc, bid
FROM Table1 t1
WHERE NOT EXISTS(
    SELECT 1
    FROM Table1 t2
    WHERE
        t2.c = t1.c
        AND t2.a = t1.a
        AND t2.b = t1.b
    HAVING COUNT(*) > 1
)

HAVING COUNT(*) > 1会检查是否有重复项。

答案 2 :(得分:1)

insert into table2 (c,a,b,rc)
select c,a,b,rc from table1 
where id in (select distinct id 
               from Table1 group by c,a,b having count(*) = 1)

答案 3 :(得分:0)

有很多方法可以做到这一点。你已经有了这么多正确的答案。在这里,我根据您接近的方式提供查询。

INSERT INTO Table2 (c, a, b, rc) 
SELECT
    c,
    a,
    b,
    rc
FROM
    Table1
GROUP BY c, a, b
HAVING  count(*) = 1;