为Access中的重复项分配唯一ID

时间:2017-06-30 17:21:42

标签: sql ms-access

我有一个非常大的Excel电子表格,我转移到Access以尝试更轻松地处理它。我非常喜欢新手。我正在尝试通过Access使用SQL。

我需要为重复项分配唯一标识符。我见过人们在SQL中使用DENSE_RANK但我无法在Access中使用它。

以下是我要做的事情:我有大量的患者和样本数据(20k行)。我的列名为FULL_NAME,SAMPLE_NUM和DATE_REC。一些患者不止一次进来并且有多个样本。我想给每位患者一个我想称之为PATIENT_ID的唯一ID。

除了在每一行输入外,我无法弄清楚如何做到这一点。我非常感谢帮助,因为我真的不知道自己在做什么,而且我的工作中没有人可以提供帮助。

4 个答案:

答案 0 :(得分:0)

听起来像FULL_NAME目前是唯一标识符。但是,名称的唯一标识符非常差,名称部分应位于不同的字段中。您确定您没有多名同名患者,例如约翰史密斯?

您需要一个PatientInfo表,然后是SampleData表。做一个提取DISTINCT患者信息的查询(显然这只是一个字段--FULL_NAME)并创建一个表格,用自动编号字段生成唯一ID。然后构建一个连接两个FULL_Name字段上的表的查询,并更新SampleData中名为PatientID的新字段。从SampleData中删除FULL_Name字段。

答案 1 :(得分:0)

表中对行进行编号的命令为[1]

ALTER TABLE MyTable ADD COLUMN ID AUTOINCREMENT; 

无论如何,正如June7指出的那样,根据患者姓名组合记录可能不是一个好主意,因为可能存在重复记录。更好的方法是将每条记录视为现在的独特患者,并在患者回来时找到一种方法来修复患者ID。我建议采用这种方式:

  1. samples表格中创建两个新列
    • ID根据上述查询自动增量
    • patientID您将从ID列复制值 - 现在它们将是相同的。但将来他们会分道扬。
  2. 将列patientIDpatientName复制到单独的表patients
  3. 现在您可以从patientName表格
  4. 中删除samples
  5. 将列imported添加到patients表,以指示可能存在属于该患者的其他记录。
  6. 当患者回来时,您打开他的记录,更新所有其他信息,如地址,电话,......并查找属于他的所有可能的样本记录。如果是,则在这些记录中修复患者ID。
  7. 现在您可以切换imported指示符,因为此患者数据是最新的。
  8. 为样本记录修复patientID之后。您将最终找到samples表中没有记录的患者。所以你可以去删除它们。

答案 2 :(得分:0)

除非您已经拥有自然密钥,否则当您运行不同的查询并从中构建密钥时,您将损坏此数据。从您的发布中我会猜到自然键是SAMPLE_NUM。另一个问题是,如果你按姓氏汇总,你几乎肯定会将不同的病人合并为一个。

答案 3 :(得分:0)

为了说明先前答案的文本说明,请考虑以下SQL操作查询,这些查询可以逐个在Access查询窗口中运行,也可以作为DAO的CurrentDb.ExecuteDoCmd.RunSQL的VBA字符串查询。 ALTER语句可以在MSAcecss.exe中完成。

  1. 创建患者表(生成表查询)

    SELECT DISTINCT s.FULL_NAME INTO myPatientsTable 
    FROM mySamplesTable s
    WHERE s.FULL_NAME IS NOT NULL;
    
  2. 将自动编号字段作为主键添加到新的患者表

    ALTER TABLE myPatientsTable ADD COLUMN PATIENT_ID AUTOINCREMENT NOT NULL PRIMARY KEY;
    
  3. 将空白的Patient_ID列添加到Samples表

    ALTER TABLE mySamplesTable ADD COLUMN PATIENT_ID INTEGER;
    
  4. 使用 FULL_NAME 字段更新Samples表格中的Patient_ID列

    UPDATE mySamplesTable s 
    INNER JOIN myPatientsTable p 
       ON s.[FULL_NAME] = p.[FULL_NAME]
    SET s.PATIENT_ID = p.PATIENT_ID;
    
  5. 维护third-norm principles of relational databases并从Samples表中删除 FULL_NAME 字段

    ALTER TABLE mySamplesTable DROP COLUMN FULL_NAME;
    

    然后在单独的查询中,在 PATIENT_ID 上添加foreign key constraint

    ALTER TABLE mySamplesTable
      ADD CONSTRAINT PatientRelationship
      FOREIGN KEY (PATIENT_ID)
      REFERENCES myPatientsTable (PATIENT_ID);