在mySQL中将记录标记为重复记录
我不是一个喜欢数据库的人,但我得到了清理别人数据库的“有趣”工作。我们的数据库中有许多重复记录,一些客户每月收到两倍或三倍的账单 给出以下数据库示例 : 是否可以编写一个查询,识别所有重复的电话号码(在本例中为记录1和4),然后通过更新DoNotBill列标记并复制记录yes。但是没有标记第一条记录 在本例中,我们只剩下:在mySQL中将记录标记为重复记录,mysql,Mysql,我不是一个喜欢数据库的人,但我得到了清理别人数据库的“有趣”工作。我们的数据库中有许多重复记录,一些客户每月收到两倍或三倍的账单 给出以下数据库示例 : 是否可以编写一个查询,识别所有重复的电话号码(在本例中为记录1和4),然后通过更新DoNotBill列标记并复制记录yes。但是没有标记第一条记录 在本例中,我们只剩下: ID Name Phone DoNotBill 1 Acme Inc 5125551212 No 2
ID Name Phone DoNotBill
1 Acme Inc 5125551212 No
2 ABC LLC 7138221661 No
3 Big Inc 4132229807 No
4 Acme 5125551212 Yes
5 Tree Top 2127657654 No
首先,我假设DoNotBill列只有两个可能的值;是和否。在这种情况下,它应该是bool而不是varchar,这意味着它要么是真的,要么是假的 此外,我不明白DoNotBill列的含义。你为什么不用这样的东西呢
select distinct phone from customers
UPDATE
customers cust,
(SELECT
c1.ID,
c1.name,
c1.phone,
c1.DoNotBill
FROM customers c
LEFT JOIN
(SELECT
cc.ID
FROM customers cc
) as c1 on c1.phone = c.phone
) dup
SET cust.DoNotBill = 'Yes' WHERE cust.id=dup.id ;
这样,您的电话号码就不需要重复,也不需要额外列。类似这样的内容
select distinct phone from customers
UPDATE
customers cust,
(SELECT
c1.ID,
c1.name,
c1.phone,
c1.DoNotBill
FROM customers c
LEFT JOIN
(SELECT
cc.ID
FROM customers cc
) as c1 on c1.phone = c.phone
) dup
SET cust.DoNotBill = 'Yes' WHERE cust.id=dup.id ;
这取决于你的数据量 你可以分步完成,并使用一些工具,如excel 这是qrt
SELECT a.id,b.id,a.phone FROM clients a , clients b WHERE
A.phone =b.phone
And a.id!=b.id
结果是所有重复的记录。
加
每2个副本,u将获得1条记录。
如果你喜欢这些唱片,它们正是你所需要的。ChNge select可选择a.id和
将此qry用作update sql语句的子qry
UPDATE clients SET billing='no' WHERE id IN ( sql goes here)
这样不仅消除了重复项,而且处理了所有的多个条目。为什么不在电话号码上加入表格本身呢?可能是重复项的一部分,但与该帖子不同。。。OP希望更新附加记录,但在找到重复记录后不更改第一个记录不计费的原因是一个电话号码可以有多个组织名称。。但他们只想为每个客户开一次账单(他们的桌子是如何设置的)。他需要一个更新查询来更改表内容john是否正确。我没有建立这个数据库,我被迫在我之前的“天才”范围内工作。我宁愿简单地修补这个烂摊子,也不愿被赋予重写应用程序和数据库的项目,这是一项我没有资格做的任务,也没有任何愿望去做的任务。Donotbill字段是某个长期被放弃的项目的遗迹,这是我可以利用的一种黑客手段。。。您还可以编写查询以多种方式更新信息感谢您清除了这些信息,很抱歉您必须处理这些混乱:)为什么要更改数据库中的所有记录?这似乎是一种比仅仅查找副本并更改副本更慢/更无效的方法。我认为这是一种一次性维护操作,所以性能并不重要。使用此方法,您不仅可以消除重复项,还可以消除所有重复项(更新答案)
UPDATE customers c SET c.DoNotBill="Yes";
UPDATE customers c
JOIN (
SELECT MIN( ID ) ID, Phone
FROM customers
GROUP BY Phone
) u ON c.ID = u.ID AND c.Phone = u.Phone
SET c.DoNotBill="No";