#sql #ms-access
Вопрос:
Пытаюсь понять, как связать две таблицы, в частности, Лекарства и лекарства.
Мой сценарий выглядит следующим образом:
SELECT DISTINCT Physician.FirstName, Physician.LastName
FROM Physician, Consultation, Medication, Medicine
WHERE Physician.Specialty = 'Geriatrics'
AND Medicine.Name = 'Aspirine'
AND Consultation.PhysicianID = Physician.ID
AND Consultation.ConsultationID = Medication.ConsultationID
Я предполагаю, что мне придется использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, но я не совсем уверен, так как я новичок в этом. Запрос должен содержать имя врача и специальность, который назначил аспирин.
Комментарии:
1. Я согласен, что вы должны использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо списка таблиц, разделенных запятыми. Для того, что у вас есть до сих пор, это выглядело бы так:
FROM Physician INNER JOIN Consultation ON Consultation.PhysicianID = Physician.ID INNER JOIN Medication ON Consultation.ConsultationID = Medication.ConsultationID INNER JOIN
«Медицина» В <К КАКОЙ КОЛОНКЕ МЫ ЗДЕСЬ ПРИСОЕДИНЯЕМСЯ?> ГДЕ Врач. Специальность = «Гериатрия» И медицина. Название = «Аспирин» Что неясно, и я отметил здесь, так это то, какMedicine
это связано с одной из ваших других таблиц. Какой столбец имеетMedicine
общее с одной из этих таблиц?2. Используйте конструктор запросов доступа. Доступ придирчив к заключению в скобки нескольких соединений таблиц. Дизайнер графического интерфейса вставит их для вас. Отредактируйте вопрос, чтобы показать примеры данных в виде текстовых таблиц.
3. Нормализация таблиц Google. На ленте в разделе Инструменты базы данных выберите связи для подключения таблиц. Как только это выглядит правильно, запрос доступа Google, затем используйте конструктор запросов доступа, чтобы помочь написать свой sql.
Ответ №1:
Я думаю, что вам не хватает связи между консультациями Аспирина и консультациями гериатров. В то же время то, как вы написали запрос, очень неэффективно, когда таблицы становятся большими, потому что вы выполняете полное объединение четырех таблиц. Оптимизатор запросов доступа, скорее всего, устраняет неэффективность, но я все еще думаю, что писать код таким образом не рекомендуется. Я полагаю, что вам нужен приведенный ниже код. Это может показаться вам большим и громоздким, но я могу сказать вам, что оно гораздо лучше отражает логику того, что вы пытаетесь сделать, и его будет легче поддерживать. Я предполагаю, что в таблице «медицина» есть поле под названием «medicineID» (или что-то подобное), а в таблице «консультация» есть эквивалентное поле. Как я указывал выше, я думаю, что вам не хватает связи между этими двумя полями. Код был бы:
SELECT DISTINCT Physician.FirstName, Physician.LastName
(-- Cons_Ger produces all the consultations by Geriats
SELECT Geriats.ID, FirstName, LastName, ConsultationID
FROM
(SELECT FirstName, LastName, ID
FROM Physician
WHERE Speciality = "Geriatrics"
) AS Geriats
INNER JOIN
(SELECT PhysicianID, ConsultationID
FROM Consultation
WHERE True -- I guess you need some condition here. If not, suppress this line
) AS Consult
ON Geriats.ID = Consult.PhysicianID
) AS Cons_Ger
INNER JOIN
(-- This produces all the consultations prescribing Aspirine
SELECT Geriats.ID, FirstName, LastName, ConsultationID
FROM
(SELECT MedicineID, Name
FROM Medicine
WHERE Name = "Aspirine"
) AS Asp
INNER JOIN
(SELECT MedicineID, ConsultationID
FROM Consultation
WHERE True -- I guess you need some condition here. If not, suppress this line
) AS Consult
ON Asp.MedicineID = Consult.MedicineID
) AS Cons_Asp
ON Cons_Ger.ConsultationID = Cons_Asp.ConsultationID
Если это не то, что вы хотите, пожалуйста, уточните свой вопрос (перечислите поля таблиц «медицина» и «консультация»), и я постараюсь оказать дополнительную поддержку. Более подробная информация на LightningGuide.net.