2017-07-04 78 views
1

我是SQL新手,所以要温柔!我在伦敦为一家慈善机构工作,所以我正在刺探SQL,而且我已经陷入了一些你可能都闭目养神的事情。来自另一行(新手)的信息SQL更新行

我有一个表,我想更新行:

The table

这显示了在我们的数据库中潜在的重复记录的表。有一个存储过程根据客户帐户中的数据创建标准字段,如果来自2个记录的标准字段匹配,则会将其标记为潜在的重复项。

我们有一些已知的重复项,我们不得不创建一个前一个以Placeholder作为姓。

标准字段与我们想要保留的真实姓氏相匹配的其他“真实”记录。

我想要做的是:

  1. 更新Placeholder者的地位Delete;与“真实”的人,以Keep(甚至我完全可以突击的!)
  2. 更新Placeholder者的保ID字段,以便它是该行与匹配准则场

一旦这就是CUSTOMER_NO场完成后,另一个存储过程将从那里采取。

帮助!

+2

你好...几件事情,你可以标记你的DBMS(SQL服务器,甲骨文,MySQL等)?另外,你可以发布你迄今为止尝试过的吗?最后,如果您将数据作为表格而不是图像发布在您的Q中,那么我们可以更轻松地处理这些数据。 – JohnHC

+2

欢迎来到Stack Overflow。请花点时间参加[Tour](https://stackoverflow.com/tour)并阅读[how-to-ask](https://stackoverflow.com/questions/how-to-ask)以获取更好的回答你的问题 –

回答

0

嗨欢迎来到Stack Overflow。

如果我明白你正确,你需要这样的事:

declare @customers table(
    customer_no int NOT NULL, 
    matching_criteria varchar(50) NOT NULL, 
    lname varchar(50) NOT NULL, 
    keepID int NULL, 
    [status] varchar(50) NULL); 

INSERT INTO @customers VALUES(1, 'a', 'Smith', null, null); 
INSERT INTO @customers VALUES(2, 'a', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(3, 'b', 'Jones', null, null); 
INSERT INTO @customers VALUES(4, 'b', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(5, 'c', 'Brown', null, null); 
INSERT INTO @customers VALUES(6, 'c', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(7, 'd', 'Williams', null, null); 
INSERT INTO @customers VALUES(8, 'd', 'Placeholder', null, null); 
INSERT INTO @customers VALUES(9, 'e', 'Taylor', null, null); 
INSERT INTO @customers VALUES(10, 'e', 'Placeholder', null, null); 

SELECT * FROM @customers; 

UPDATE @customers set [status] = case lname WHEN 'Placeholder' THEN 'DELETE' ELSE 'Keep' END; 

SELECT * FROM @customers; 

UPDATE k 
SET keepID = d.customer_no 
FROM 
@customers k 
INNER JOIN @customers d 
on k.matching_criteria = d.matching_criteria 
WHERE d.[status] = 'Delete' AND k.[status] = 'Keep'; 

SELECT * FROM @customers; 

如果您使用的是SQL Server,您可以在查询窗口粘贴并观察结果。

请为将来的参考告诉我们你正在使用哪个数据库,因为答案不一样从db到db。以上是具体的SQL Server。虽然大多数dbs的表现会类似,但有些不会。以上更新加入。例如,Oracle不允许这样做,所以使用Oracle的语法不同 - Oracle当然可以实现同样的目的,它只是使用不同的SQL来实现。

+0

谢谢!我稍微修改了一下,它完全奏效。注意到数据库的事情 - 我甚至没有想到这一点。这是在SQL Server 2014上(我相信它是T-SQL)。 –

+0

很高兴有帮助。 –