如何在SQL查询中对数据进行非规范化

时间:2019-05-30 16:52:13

标签: sql

我有一个包含临床名称和医生名称的表格。一个诊所可以有很多医生。我需要将此数据分为两个表。一个带有诊所信息,另一个带有医生信息

尝试在SQL查询中执行此操作

表CLINIC_DOC:

ID  ClinicName  Doctor
------------------------
1   xyz         Dr Joe
2   xyz         Dr Bob
3   abc         Dr Mary
4   abc         Dr John

我想像这样将数据分成以下表格:

Table ClinicsData:

ClinicID    ClinicName
----------------------
1           xyz
2           abc

Table DoctorData:

DocId   ClinicID    Doctor
--------------------------
1       1           Dr Joe
2       1           Dr Bob
3       2           Dr Mary
4       2           Dr John

2 个答案:

答案 0 :(得分:1)

假设ID列(ClinicIDDocID是自动生成的,并且诊所名称是唯一的(即,在您的现实世界中,没有两个诊所使用相同的名称)数据代表),您可以尝试:

INSERT INTO clinicsdata
            (clinicname)
            SELECT DISTINCT
                   cd.clinicname
                   FROM clinic_doc cd;

INSERT INTO doctordata
            (clinicid,
             doctor)
            SELECT c.clinicid,
                   cd.doctor
                   FROM clinic_doc cd
                        INNER JOIN clinicsdata c
                                   ON c.clinicname = cd.clinicname;

答案 1 :(得分:1)

首先,您可能需要创建要填充的表。这是我对数据类型的最佳猜测:

CREATE TABLE ClinicsData
(
    ClinicID INT IDENTITY(1,1),
    ClinicName varchar(100)
)

CREATE TABLE DoctorData
(
    DocID INT IDENTITY(1,1),
    ClinicID INT,
    Doctor VARCHAR(100)
)

请注意,我已将ClinicsData.ClinicID列为IDENTITY列。这将有助于我们稍后填充DoctorData

接下来,让我们用所有不同的诊所名称填充ClinicsData

INSERT INTO ClinicsData
(
    ClinicName
)
SELECT DISTINCT 
    ClinicName 
FROM CLINIC_DOC;

现在,我们可以使用ClinicsData利用DoctorData来填充INNER JOIN

INSERT INTO DoctorData
(
    ClinicID
    ,Doctor
)
SELECT DISTINCT 
    cd.ClinicID,
    c_d.Doctor
FROM CLINIC_DOC c_d
INNER JOIN ClinicsData cd ON cd.ClinicName = c_d.ClinicName