MS Access - привязка к записи через сохраненный идентификатор
У меня есть несколько таблиц, настроенных в Access следующим образом (простите за немного избыточный пример содержимого):
Table 1:
- ID
- FirstName
- SecondName
Table 2:
- ID
- Details
- PersonID -> Table 1[ID]
Table 3:
- ID
- Group
- PersonDetails -> Table 2[ID]
Таблица 1 является базовой таблицей, содержащей записи и не получающей никакой другой информации. Например, он может хранить чье-то имя и фамилию вместе с идентификатором автономного номера.
Таблица 2 содержит записи, которые, помимо прочего, содержат поле, которое ссылается на Таблицу 1 и хранит идентификатор одной из хранящихся там записей. С помощью мастера поиска я могу выбрать использование всех полей из таблицы 1, сохранить идентификатор записи таблицы 1 в поле таблицы 2, а также отобразить имя и фамилию в поле со списком в форме, чтобы сделать выбор записи более интуитивно понятным.
В таблице 3 мне нужно сохранить идентификатор одной из записей в таблице 2. Однако я также хотел бы снова отобразить в форме списка первые и вторые имена из связанной записи (в таблице 1), чей идентификатор хранится в таблице 2. Я не могу выбрать использование, например, поля PersonDetails из таблицы 2, поскольку это просто помещает идентификационные номера в поле со списком - мне нужно сделать что-то эквивалентное:
Table 2[ID]->[FirstName]
Можно ли это сделать с помощью мастера поиска в Access, или мне придется искать запросы или VBA?
Благодарю.
1 ответ
Ваш запрос для вашего комбо должен выглядеть примерно так:
SELECT cp.ID, cp.ReferenceName, c.Company, p.FeePerHour
FROM (ClientProfile AS cp LEFT JOIN Clients AS c ON cp.ClientID = c.ID)
LEFT JOIN Pricing AS p ON cp.PricePlanID = p.ID;
Основная проблема с вашим запросом заключается в том, что вам не хватает скобок, которые необходимы, когда у вас есть несколько объединений. Если у вас было еще одно соединение, вам понадобится второй набор скобок.
Я взял немного свободы и использовал псевдонимы таблиц. Это делает SQL лаконичным и более читабельным.
Если этот запрос все еще не работает, возможно, это связано с тем, что вы пытаетесь объединить "дочерние таблицы" с "основной таблицей", не используя поля внешнего ключа в качестве поля объединения. Если бы это была моя база данных, SQL выглядел бы примерно так:
SELECT cp.ClientProfileID, cp.ReferenceName, c.Company, p.FeePerHour
FROM (ClientProfile AS cp LEFT JOIN Clients as C ON cp.ClientID = c.ClientID)
LEFT JOIN Pricing AS p ON cp.ClientProfileID = p.ClientProfileID;
Лично я в основном никогда не использую простой идентификатор в качестве имени поля. И при создании внешнего ключа я обычно использую то же имя поля, что и исходная таблица. Существуют исключения, особенно в случае, когда вам нужно ссылаться на одну и ту же таблицу более одного раза. Рассмотрим случай, когда вы отслеживаете свойства недвижимости, и у вас есть Покупатель и Продавец, которые оба являются сущностями (но отличаются друг от друга) в одной таблице "Люди". Затем вам нужно будет назвать их как BuyerID и SellerID, но в конечном итоге они будут ссылаться на PersonID в таблице Person.
Итак, вот дизайн стола, за которым я бы пошел. Обратите внимание, что я изменил группу на PriceGroup. Следите за зарезервированными словами при программировании не только на SQL, но и на любом языке. Если в какой-то момент вы назовете поле "Группа", вы будете пытаться "Группировать по группе", что звучит и выглядит плохо, если ничего больше.
Client:
- ClientID
- FirstName
- SecondName
ClientProfile:
- ClientProfileID
- Details
- ClientID (Foreign Key to Client)
Pricing:
- PricingID
- PriceGroup
- ClientProfileID (Foreign Key to ClientProfile)