选择包含ID中重复值的所有行,并从上一个表中删除它们

时间:2016-03-09 09:02:48

标签: sql

我有一个表C,它是作为A和B的联盟创建的。可以创建足以解决我的问题的简化版本如下:

CREATE TABLE C
(
ID int,
String varchar(50),

);

insert into C values (1,'afa')
insert into C values (1,'afa')
insert into C values (2,'afa')
insert into C values (3,'afa')
insert into C values (4,'afa')
insert into C values (4,'afa')
insert into C values (5,'afa')
insert into C values (6,'afa')

我需要选择ID列中包含重复值的所有行,然后我很可能需要从表B中删除带有这些ID的行。表A和B不包含重复值。

选择查询的结果应该像

ID string
1   afa
1   afa
4   afa
4   afa

顺便说一句:ID重复的其他列略有不同所以我不会在第一时间使用union删除它

THX

2 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题..你想删除表a中出现的表b中的ID?如果是这样,你可以使用EXISTS():

DELETE FROM B
WHERE EXISTS(SELECT 1 FROM A
             WHERE B.id = A.id)

仅将其选为@artm建议:

SELECT ID FROM c
GROUP BY ID
HAVING COUNT(*) > 1

或者再次存在:

SELECT ID from B
WHERE exists(SELECT 1 FROM A
             WHERE B.ID = A.ID)

编辑:要获得您发布的结果,假设C表尚未存在:

SELECT * FROM (
    SELECT * FROM B
    UNION
    SELECT * FROM A) t
WHERE t.id  IN(SELECT ID FROM(SELECT ID FROM A
                              UNION
                              SELECT ID FROM B)
               GROUP BY ID 
               HAVING COUNT(*) > 1)

答案 1 :(得分:0)

使用Group byHaving查找重复项:

select id 
from c
group by id
having count(*) > 1;

如果您需要删除表B中的数据,请升级以前的查询:

delete 
from B
where id in (
    select id 
    from c
    group by id
    having count(*) > 1);

更新: 如果您想收到列出的结果:

select *
from c 
where id in (
    select id 
    from c
    group by id
    having count(*) > 1);

结果:

ID string
1   afa
1   afa
4   afa
4   afa