У меня есть таблица с именами клиник и именами врачей. в одной клинике может быть много врачей. Мне нужно разделить эти данные на две таблицы. один с информацией о клинике, а другой с информацией о докторе
пытаюсь сделать это в 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
@Dai Вот почему вы сначала создаете и заполняете ClinicsData с помощью ClinicsID в качестве столбца идентификатора. Затем вы можете использовать ClinicsData для заполнения DotorData.
Предполагая, что столбцы идентификаторов (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
Это невозможно, потому что ваша исходная таблица не определяет первичный ключ для клиник, а только для врачей. Откуда мы знаем, что клиника
abc
предназначена дляClinicID = 2
?