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)
Другие вопросы по тегам