具有相同ID的多个值的数据库

我有一个数据库,其中每个实体都有一个唯一的ID,但是最近所有的实体名称都被改变(不以相同的方式)以提高可读性。 这些更改在不同的名称中不是标准的,并且从ID到ID各不相同。 这使得大量的总结报告如下所示:

ID Name Total for the year 3011 Joesmith 3000 3011 Joe Smith 1000 5024 DBS 400 5024 Deborah Smith 150 

各行可能看起来像这样:

 ID Name Transaction Date 3011 Joesmith 2000 January 1, 2017 3011 Joesmith 1000 January 2, 2017 3011 Joe Smith 500 February 1, 2017 3011 Joe Smith 500 February 5, 2017 

修改旧条目以匹配新条目或仅显示任何匹配的ID的新名称的最佳方法是什么? 在这一天结束时,我们可以通过使用ID来获得我们感兴趣的摘要,但是最终我们想通过查看我们的名字来解释这些摘要。

我们正在查看大约1000个不同名称的ID,总共可能有5万行左右。

选项A:使用每个ID的最新名称更新您的表格:

 UPDATE A SET A.Name = B.Name FROM YourTable A JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN FROM YourTable) B ON A.ID = B.ID AND B.RN = 1 

选项B:改变您的报告以回到表格以获取每个ID的最新名称。 这是一个方法:

 SELECT A.ID, B.Name, SUM(Transaction) TotalForTheYear FROM YourTable A JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN FROM YourTable) B ON A.ID = B.ID AND B.RN = 1 GROUP BY A.ID, B.Name 

这些使用ROW_NUMBER() ,这在所有DBMS(主要是MySQL)中都不可用。 如果ROW_NUMBER()不可用,还有其他方法来编写它。 此外, UPDATE语法可能会有所不同。 在您的问题中始终标记或提及您的DBMS选项。

以下是一个解决scheme,假设您要设置具有空间的名称,并且对于您在文章中列出的每个ID,只有两个名称变体。 它也假定MS SQL Server没有标记DBMS

如果要使用没有空格的名称,请在WHERE子句中将>0更改为=0

 UPDATE your_table SET your_table.Name = a.Name FROM ( SELECT DISTINCT ID, Name FROM your_table ) a WHERE CHARINDEX(' ', a.Name) > 0 AND your_table.ID = a.ID 

我build议你testing一下你的表的副本

虽然你可以更新数据,但更好的方法似乎是修复你的数据库,所以名字只能存在一次。 然后,您应该从交易表中删除该名称,并返回到具有该名称的实体。 我意识到这可能不实际,但比修正非规范化数据更正确