我正在尝试从数据库中删除重复数据,其中数据跨多个表。
我有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 |
答案 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');
我没有检查级联约束。我想它不应该给你任何问题。