Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Запрос на выборку данных из нескольких таблиц (http://forum.oszone.net/showthread.php?t=245960)

old_nick 01-11-2012 13:59 2016483

Запрос на выборку данных из нескольких таблиц
 
Есть база данных. В ней имеются таблицы:
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 2016534

Цитата:

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

Упрощать и переделывать структуру базы данных не надо.

Наподобие:
Код:

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 2017464

Iska, спасибо. Вроде работает. Только не понял, зачем точка с запятой в конце. Привет Паскалю?

Iska 02-11-2012 18:26 2017490

old_nick, у меня не было в тот момент под рукой доступа к SQL серверу, потому я воспользовался Microsoft Access. Точка с запятой — оттуда.

old_nick 04-11-2012 03:03 2018285

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 2018364

Примерно так:
Код:

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 2019498

Iska, спасибо, работает.

old_nick 13-11-2012 02:47 2024540

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

Пробовал сделать, как тут и тут, но в результате нет возможности редактировать.

Iska 13-11-2012 09:52 2024599

Какова цель добавления такого поля?

old_nick 13-11-2012 11:27 2024650

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

Iska 14-11-2012 08:45 2025340

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

old_nick 15-11-2012 16:36 2026171

Iska, спасибо, я уже нашел способ решить последнюю задачу с помощью среды программирования.
Еще раз большое спасибо за помощь!

Iska 15-11-2012 17:29 2026224

old_nick, как решили?

old_nick 16-11-2012 17:54 2026927

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

Iska 16-11-2012 19:05 2026971

old_nick, ну, а цвет где хранится?

old_nick 19-11-2012 16:29 2028305

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


Время: 21:11.

Время: 21:11.
© OSzone.net 2001-