删除多个表中的重复sql

时间:2015-01-14 19:48:25

标签: sql oracle

我正在尝试从数据库中删除重复数据,其中数据跨多个表。

我有3个表,Person,Person_Address_Map和Address。我想删除所有重复的行,除了我的人员表中的一行,但我还要检查地址数据是否相同(但不删除地址表中的任何行)。

我有以下内容删除了Person表中除一个重复条目以外的所有条目。

  DELETE
  FROM Person p
  WHERE EXISTS
    (SELECT 1 
    FROM Person temp
    Where p.name = temp.name AND
    p.id < temp.id);


 Person                    Person_Address_Map             Address
 | ID | Name | Age |       | Person_ID | Address_ID |     | ID | City | State |
 -------------------       --------------------------     ---------------------
 | 1  | Bob  |  20 |       |     1     |     1      |     | 1  | NYC  |  NY   | 
 | 2  | Bob  |  20 |       |     2     |     2      |     | 2  | NYC  |  NY   |
 | 3  | Jon  |  50 |       |     3     |     3      |     | 3  | LA   |  CA   | 
 | 4  | Jon  |  50 |       |     4     |     4      |     | 4  | SF   |  CA   |

现在我的地址表有一个城市。 Person_Address_Map包含人员ID和地址ID。如何更改此查询,以便它不会检查“...”名称&#39;人是平等的,但也是“城市”。它们在Address表中映射到的是相等的? (不删除地址表中的任何数据)

删除并留下一个副本后,我希望在我的人员表中留下以下内容。 Person_Address_Map也在更新中。

 Person                    Person_Address_Map             Address
 | ID | Name | Age |       | Person_ID | Address_ID |     | ID | City | State |
 -------------------       --------------------------     ---------------------
 | 1  | Bob  |  20 |       |     1     |     1      |     | 1  | NYC  |  NY   | 
                                                          | 2  | NYC  |  NY   |
 | 3  | Jon  |  50 |       |     3     |     3      |     | 3  | LA   |  CA   | 
 | 4  | Jon  |  50 |       |     4     |     4      |     | 4  | SF   |  CA   |

1 个答案:

答案 0 :(得分:1)

我想这应该可行,

DELETE
  FROM PERSON P
 WHERE EXISTS (SELECT 1
          FROM (WITH TABLE_ AS (SELECT P.ID,
                                       P.NAME,
                                       P.AGE,
                                       PERSON_ID,
                                       ADDRESS_ID,
                                       A.ID ADD_ID,
                                       A.CITY,
                                       A.STATE
                                  FROM PERSON             P,
                                       PERSON_ADDRESS_MAP PA,
                                       ADDRESS_           A
                                 WHERE P.ID = PA.PERSON_ID
                                   AND PA.ADDRESS_ID = A.ID)
                 SELECT A1.ID, TABLE_.NAME
                   FROM ADDRESS_ A1, TABLE_
                  WHERE TABLE_.ADD_ID != A1.ID
                    AND TABLE_.CITY = A1.CITY
                    AND TABLE_.STATE = A1.STATE) DELETABLE_
                  WHERE P.ID > DELETABLE_.ID
                    AND P.NAME = DELETABLE_.NAME
        );

这是我使用的表格定义

CREATE TABLE person (
         ID         NUMBER(5),
         NAME       VARCHAR2(15) ,
         AGE        NUMBER(3));
CREATE TABLE Person_Address_Map (
         Person_ID          NUMBER(5),
         Address_ID          NUMBER(5)
         );         
CREATE TABLE Address_ (
         ID         NUMBER(5),
         City        VARCHAR2(15) ,
         State        VARCHAR2(15));         

INSERT INTO person VALUES (1,'Bob',20);         
INSERT INTO person VALUES (2,'Bob',20);
INSERT INTO person VALUES (3,'Jon',50);
INSERT INTO person VALUES (4,'Jon',50);

INSERT INTO Person_Address_Map VALUES (1,1);
INSERT INTO Person_Address_Map VALUES (2,2);
INSERT INTO Person_Address_Map VALUES (3,3);
INSERT INTO Person_Address_Map VALUES (4,4);

INSERT INTO Address_ VALUES (1,'NYC','NY');
INSERT INTO Address_ VALUES (2,'NYC','NY');
INSERT INTO Address_ VALUES (3,'LA','CA');
INSERT INTO Address_ VALUES (4,'CA','CA');

我没有检查级联约束。我想它不应该给你任何问题。

相关问题