Связывание таблиц с помощью SQL

#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.