Как денормализованные данные в SQL-запросе

У меня есть таблица с именами клиник и именами врачей. в одной клинике может быть много врачей. Мне нужно разделить эти данные на две таблицы. один с информацией о клинике, а другой с информацией о докторе

пытаюсь сделать это в SQL-запросе

Таблица CLINIC_DOC:

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

Я хочу разделить данные на следующие таблицы:

Таблица ClinicsData:

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

Таблица DoctorData:

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

Это невозможно, потому что ваша исходная таблица не определяет первичный ключ для клиник, а только для врачей. Откуда мы знаем, что клиника abc предназначена для ClinicID = 2?

Dai 30.05.2019 18:58

@Dai Вот почему вы сначала создаете и заполняете ClinicsData с помощью ClinicsID в качестве столбца идентификатора. Затем вы можете использовать ClinicsData для заполнения DotorData.

digital.aaron 30.05.2019 19:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что столбцы идентификаторов (ClinicID и DocID) генерируются автоматически и что названия клиник уникальны (т. е. нет двух клиник с одинаковыми именами в той части реального мира, которую представляют ваши данные), вы можете попробовать:

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;

Во-первых, вы, вероятно, захотите создать таблицы, которые собираетесь заполнить. Вот мое лучшее предположение о типах данных:

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

Другие вопросы по теме