PDA

Показать полную графическую версию : Запрос на выборку данных из нескольких таблиц


old_nick
01-11-2012, 13:59
Есть база данных. В ней имеются таблицы:
Clients - клиенты
ClientInAgreements - таблица "Заявки клиентов", связывающая Clients и Agreements.
Agreements - заявки

Один клиент может оформлять несколько заявок. С другой стороны, к одной заявке может быть привязано несколько клиентов, отсюда и такая структура.

Поля Clients:
CL_ID - уникальный ID клиента
CL_FIO
CL_email

Поля ClientInAgreements:
CA_ID - уникальный ID записи в таблице
CA_CL_ID - уникальный ID клиента (связь с таблицей Clients)
CA_AG_ID - уникальный ID заявки (связь с таблицей Agreements)

Поля Agreements:
AG_ID - уникальный ID заявки
AG_Date - дата заявки (тип DateTime)
AG_code - буквенно-цифровой код заявки

Задача такая: получить таблицу заявок, оформленных на определенную дату (например, 20.01.2012), с такими полями

Уникальный ID заявки
Буквенно-цифровой код заявки
Уникальный ID клиента
ФИО клиента
email клиента

Хочется сделать все это с помощью одного SQL-запроса.
Уникальные ID представлены целыми числами.

Упростить и переделать базу данных не предлагать, т.к. такой возможности нет.

Iska
01-11-2012, 15:26
Упростить и переделать базу данных не предлагать, т.к. такой возможности нет. »
Упрощать и переделывать структуру базы данных не надо.

Наподобие:
SELECT Agreements.AG_ID, Agreements.AG_code, Clients.CL_ID, Clients.CL_FIO, Clients.CL_email FROM Clients INNER JOIN (Agreements INNER JOIN ClientInAgreemetns ON Agreements.AG_ID = ClientInAgreemetns.CA_AG_ID) ON Clients.CL_ID = ClientInAgreemetns.CA_CL_ID;

old_nick
02-11-2012, 17:28
Iska, спасибо. Вроде работает. Только не понял, зачем точка с запятой в конце. Привет Паскалю?

Iska
02-11-2012, 18:26
old_nick, у меня не было в тот момент под рукой доступа к SQL серверу, потому я воспользовался Microsoft Access. Точка с запятой — оттуда.

old_nick
04-11-2012, 03:03
Iska, если не затруднит, подскажете, как выцепить еще и данные из таблиц Coutries и Cities?

Поля Countries:
CN_ID
CN_Name

Поля Cities:
CT_ID
CT_Name

С этими таблицами связана таблица Agreements: поля AG_CN_ID и AG_CT_ID соответственно. В результирующей таблице надо отобразить CN_Name и CT_Name

Заранее спасибо.

Iska
04-11-2012, 11:35
Примерно так:
SELECT Agreements.AG_ID, Agreements.AG_code, Clients.CL_ID, Clients.CL_FIO, Clients.CL_email, Countries.CN_Name, Cities.CT_Name FROM Countries INNER JOIN (Cities INNER JOIN (Clients INNER JOIN (Agreements INNER JOIN ClientInAgreemetns ON Agreements.AG_ID = ClientInAgreemetns.CA_AG_ID) ON Clients.CL_ID = ClientInAgreemetns.CA_CL_ID) ON Cities.CT_ID = Agreements.AG_CT_ID) ON Countries.CN_ID = Agreements.AG_CN_ID

old_nick
05-11-2012, 20:45
Iska, спасибо, работает.

old_nick
13-11-2012, 02:47
Iska, возникла еще потребность добавить в результирующий набор поле строкового типа, которое:
1) будет иметь возможность редактирования;
2) будет являться "временным", т.е. его добавление в набор и изменения в нем не будут никак сказываться на исходной БД.

Пробовал сделать, как тут (http://www.sqlmag.com/forums/aft/79146) и тут (http://stackoverflow.com/questions/5185743/how-can-i-create-a-blank-hardcoded-column-in-a-sql-query), но в результате нет возможности редактировать.

Iska
13-11-2012, 09:52
Какова цель добавления такого поля?

old_nick
13-11-2012, 11:27
Суть в том, что формируется таблица клиентов, которым потом будут рассылаться оповещения на почту. Пользователь должен иметь возможность исключить любую запись из списка рассылки, пометив ее в таблице. При этом на исходной БД это никак не должно отражаться.

Iska
14-11-2012, 08:45
old_nick, ну, создавайте временную таблицу и связывайте её с существующей по ключевым полям 1:1.

old_nick
15-11-2012, 16:36
Iska, спасибо, я уже нашел способ решить последнюю задачу с помощью среды программирования.
Еще раз большое спасибо за помощь!

Iska
15-11-2012, 17:29
old_nick, как решили?

old_nick
16-11-2012, 17:54
С помощью цветового выделения в таблице. Пользователь выбирает запись в таблице и кликает по кнопке "Поменить/снять пометку" - запись помечается цветом. Потом в зависимости от цвета запись либо обрабатывается программой, либо нет.

Iska
16-11-2012, 19:05
old_nick, ну, а цвет где хранится?

old_nick
19-11-2012, 16:29
Iska, цвет хранится в динамическом массиве с размерностью, соответствующей количеству записей в SQL-выборке.




© OSzone.net 2001-2012