【问题标题】:Fixing duplicate customers in SQL修复 SQL 中的重复客户
【发布时间】:2012-03-25 15:19:39
【问题描述】:

我在 sql server 上使用 java,我有重复客户的数据库问题 (很多客户是通过以下方式复制的)。 我的桌子是:

CUSTOMER(person_id,customer_id)
ORDER (order_id,person_id )

一个重复的客户看起来像这样:

CUSTOMER(333,040535743)
CUSTOMER(334,040535743)
CUSTOMER(335,040535743)

ORDER (1,333 )
ORDER (2,333 )

ORDER (4,334 )
ORDER (5,334 )
ORDER (6,334 )

ORDER (7,335 )
ORDER (8,335 )
ORDER (9,335 )


CUSTOMER(336,009530650)
CUSTOMER(337,009530650)

ORDER (10,336 )
ORDER (11,336 )
ORDER (12,336 )

ORDER (13,337 )
ORDER (14,337 )
ORDER (15,337 )

333,334,335是同一客户的三行,因为他们有相同的customer_id,我想只保留最后一个客户(335),并使334和333的所有订单都参考333。

我的最终数据应该是:

CUSTOMER(335,040535743)
ORDER (1,335)
ORDER (2,335)

ORDER (4,335)
ORDER (5,335)
ORDER (6,335)

ORDER (7,335 )
ORDER (8,335 )
ORDER (9,335 )



CUSTOMER(337,009530650)

ORDER (10,337)
ORDER (11,337)
ORDER (12,337)

ORDER (13,337 )
ORDER (14,337 )
ORDER (15,337 )

如何为所有重复的客户执行查询? (我有一个查询返回有重复的 customer_id 的列表)

【问题讨论】:

  • 两张表之间是否有外键约束?
  • 即使有我也可以解除约束

标签: sql database duplicates


【解决方案1】:

更新Order 表:

UPDATE o
SET o.person_id = cc.max_person_id
FROM
    [Order] AS o
  JOIN
    Customer AS c
        ON c.person_id = o.person_id
  JOIN
    ( SELECT customer_id
           , MAX(person_id) AS max_person_id
      FROM Customer
      GROUP BY customer_id
    ) AS cc
        ON cc.customer_id = c.customer_id ;

然后,更新Customer 表:

UPDATE c
SET c.person_id = cc.max_person_id
FROM
    Customer AS c
  JOIN
    ( SELECT customer_id
           , MAX(person_id) AS max_person_id
      FROM Customer
      GROUP BY customer_id
    ) AS cc
        ON cc.customer_id = c.customer_id ;

之后,最好将Customer(person_id) 定义为PRIMARY KEY 或使用UNIQUE 约束。

还有一个从Order(person_id)Customer(person_id)FOREIGN KEY 约束

【讨论】:

  • 谢谢!第一个查询完成了,我不需要第二个,我只是删除了所有没有最大人员 ID 的客户
  • 是的,对,第二个语句应该是DELETE,而不是UPDATE
【解决方案2】:

从这里开始:

select person_id from customer where customer_id = 040535743

然后是这样的:

select * from orders where person id in ( select person_id from customer where customer_id = 040535743 )

那么你可以在结果中使用 MAX person_id。

【讨论】:

  • 请注意,我有很多重复的客户,就像我提供的示例一样。这对 1 位客户来说不是问题
  • 那么建议在这个基本结构上使用 MAX 和 GROUP BY
  • 我添加了对我想要的更准确的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2022-10-25
  • 1970-01-01
相关资源
最近更新 更多