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

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

我有以下删除我的人表中除一个重复条目外的所有条目的方法。

  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。 如何更改此查询,以使其不仅检查Person的“名称”是否相等,而且还要检查其在“地址”表中映射到的“城市”是否相等? (不删除“地址”表中的任何数据)

删除并保留一个副本后,我希望在人员表中保留以下内容。 随着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楼 票数: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');

我没有检查级联约束。.我想它应该不会给您带来任何问题。

  ask by kittels translate from so

未解决问题?本站智能推荐:

4回复

Oracle PL / SQL - 如何删除SQL表中的多个重复记录?

我有表名TABLE1,包含重复记录,如下所示: 在这种情况下,我想删除所有重复的组合行,除了两个使用SQL或/通过PL / SQL,其中AMOUNT(10.00和2.00)。 此外,包含不同数量的重复记录可能超过两个,如下所示: 在上面的例子中,我只需要删除8条记录中的4条,其
2回复

在SQL中删除表中的重复行

oracle 11g中对此结果的查询是什么 我在product_table中有一个表调用程序product_table。,我没有主键,并且有这些记录 我想要一个查询,它将删除除一条记录以外的所有重复值 意味着执行该查询后,我需要此结果 可以使用sql查询或子查询而不使
4回复

使用 SQL 从表中删除重复项

感谢有人能帮我从下表中删除重复项; 让我们假设表名是“t”。 如果 col1 和 col2 的组合是唯一的,则定义我的表中的重复项。 但是,如果 col3/4/5/6 中有一个值,我更喜欢显示而不是空白,因此表格的最终输出必须如下所示; 感谢您是否也能解释代码在做什么。
3回复

用于删除表中重复项的SQL

我有一个重复的表事务。 我想保留具有最小ID的记录,并根据四个字段DATE,AMOUNT,REFNUMBER,PARENTFOLDERID删除所有重复项。 我写了这个查询,但我不确定这是否可以以有效的方式编写。 你认为有更好的方法吗? 我问,因为我担心运行时间。
3回复

删除SQL表中的重复值

我需要帮助,我有一个要求: 我的答案: 我不想重复相同名称的条目
3回复

尝试使用 SQL 从多个表中删除

我的应用程序中有 4 个表: 用户 用途 上行列表 项目共享 最后三个表包含一个名为session_id的字段。 在下面的代码,括号中的部分工程,以获取所有session_id从值usession表用户“awpeople”。 问题是如何将这个结果集读入一个数组并从session_i
2回复

如何使用PL / SQL从不同的表中删除(删除)多个用户

我编写了此查询,以便使用pl / sql从不同的表中删除一个用户。 示例:我运行此查询以删除一个用户: 用户 SPIKETJ , 代码 01234 , code_id 85412974和l_code_user SPIKETJ 当我必须删除一个用户时,我只更改/分配以下值: l
3回复

如何从sql中的表中获取和删除旧的重复记录

我有一张桌子: 其中SE1是旧记录, SE是新记录。 通过以下查询我得到了新记录。 请帮我查询以获取旧记录的记录。 我想获取旧记录并想要删除。 我想要的输出: 这是一个示例表(不是实际的表/数据)..我有一个大约10k数据的表,它在一个实时系统中。 所以我