我不是数据库人员,但我已经获得了清理别人数据库的“乐趣”工作。我们的数据库中有许多重复记录,一些客户每个月都会收到双倍或三倍的费用。
给出以下数据库示例 :
Table: Customers
ID Name Phone DoNotBill
1 Acme Inc 5125551212 No
2 ABC LLC 7138221661 No
3 Big Inc 4132229807 No
4 Acme 5125551212 No
5 Tree Top 2127657654 No
是否可以编写标识所有重复电话号码的查询(在本例中为记录1和4),然后通过更新DoNotBill列来标记和复制记录。但是没有标记第一条记录。
在这个例子中,我们将留下:
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
答案 0 :(得分:1)
首先,我假设DoNotBill列只有两个可能的值;是的,不。在这种情况下,它应该是bool而不是varchar,这意味着它将是true或false。
此外,我没有得到DoNotBill列的含义。你为什么不用这样的东西?
select distinct phone from customers
这样可以为您提供不重复的电话号码,而无需额外的列。
答案 1 :(得分:1)
这样的事情?
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 ;
答案 2 :(得分:0)
这取决于您的数据量 你可以分步完成并使用像excel这样的工具......
这个qrt
SELECT a.id,b.id,a.phone FROM clients a , clients b WHERE
A.phone =b.phone
And a.id!=b.id
结果是所有重复的记录。 添加
Group by a.phone
你将获得每2个重复的1条记录。 如果您喜欢这些记录,那么它们就是您所需要的。 ChNge选择选择a.id和 使用此qry作为更新sql语句的子项
UPDATE clients SET billing='no' WHERE id IN ( sql goes here)
答案 3 :(得分:-1)
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";
这样不仅可以消除重复,而且还会处理所有多个条目。