Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос с использованием имен других dataset (виртуальных таблиц) [D2005, XP]


Alex7 ©   (2007-05-17 11:19:00) 

Здравствуйте, уважаемые мастера.
Подскажите, пожалуйста, как будет выглядеть текст запроса, если в  нем использовать имена других TADOQuery.
Другими словами в:
SELECT ... FROM Table1 T1 INNER JOIN Тable2 ON (T1.Id = T2.Id)
заменить имя таблицы Table1 базы данных на имя DataSet, сформированного с помощью другого TADOQuery. (База MS Access 2003)
Спасибо!


Alex7   (2007-05-18 11:26:00) [1]

>Sergey13
Спасибо за ответ.


Sergey13   (2007-05-18 08:51:00) [2]

> [8] Alex7 ©   (18.05.07 08:09)
> Повторю идею-велосипед

Твоя идея легко решается с помощью временных таблиц, они собственно и придуманы для этого. Но при этом нужны НАСТОЯЩИЕ временные таблицы, поддерываемые СУБД. Приспосабливание под это дело обычных таблиц может здорово замусорить БД и замедлить ее работу. В аксесе таких временных таблиц, насколько я знаю нет.
Так что единственный приемлемый путь - оптимизация выборки. Это облегчается у тебя тем, что БД только для чтения. Можно как угодно ее денормализовать и проиндексировать.


Alex7   (2007-05-18 08:09:00) [3]

Здравствуйте, уважаемые мастера.
Изините, было не моё время суток.
>DrAndrey ©  [6]
1. Слово усекает применил для обозначения сокращения объема данных.
2. Access в многопользовательском режиме.
3. Раз в час - редко, несколько раз в минуту - часто.

По условиям задачи даные только просматриваются, не редактируются.
Задача  - каталог объектов(имен файлов), каждый объект которого принадлежит нескольким деревьям признаков. Хорошо в лесу: один конкретный лист висит только на одном дереве, если он вообще висит, в данной задаче - на нескольких одновременно. Поэтому и пришла идея двухступенчатого отбора.
Повторю идею-велосипед: Первый запрос по сложным условиям выбирает часть данных из многотабличной нормализованной базы, формируя одну таблицу даных (конечно происходит денормализация). Эта таблица-набор данных формируется  не как дополнительная таблица в самой базе данных, а как переменная приложения (может быть какой-нибудь временный файл) у пользователя. Второй, динамический формируемый, запрос отбирает данные из этого файла-переменной для отображения в гридах.

>Sergey13 ©  
Спасибо за "оптимизировать первичный запрос, добавляя нужные индексы". Наверное это путь к решению.


Sergey13   (2007-05-17 14:48:00) [4]

> [5] Alex7 ©   (17.05.07 13:25)

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


DrAndrey   (2007-05-17 14:31:00) [5]

Что значит усекает второй запрос? Почему виртуальную? Какая используется БД? И вообще часто-редко - это как?


Alex7   (2007-05-17 13:25:00) [6]

С ДЕЛЬФИ только начал работать. В Parodox-е можно результат выполнения запроса присвоить переменной типа TCursor, а затем работать с ней как с таблицей.db (изменять в ней данные, использовать её в других запросах).
Исходные условия конкретной задачи (отображения данных в Контролах) благоприятствуют следующему решению: Пусть относительно долго, но редко выполняется тяжелый запрос, который первично усекает даные, и формирует виртуальную таблицу, а затем часто(так нужно) и быстро его усекает второй запрос. Это сама идея-велосипед. По условиям же конкретной задачи и второй запрос также нужно будет связывать с одной-двумя таблицами базы данных, но не так тяжело по времени выполнения.
Можно ли реализовать как-то так, может дадите ссылку?
Спасибо.


ЮЮ   (2007-05-17 12:13:00) [7]

Тогда и во втором случак динамически формируй полный запрос, основнный на таблицах. Соединять в запросе можно и более 2х таблиц. :)


Alex7   (2007-05-17 11:47:00) [8]

Спасибо за ответ. К сожалению применить это решение не смогу. Тексты обоих запросов нужно формировать динамически в RunTime.


Desdechado   (2007-05-17 11:45:00) [9]

СУБД не имеет представления о твоих каких-то программных датасетах. Она оперирует своими.


ЮЮ   (2007-05-17 11:24:00) [10]

Запрос положить не в TADOQuery, в "Запросы" в Access и назвать Query2

Тогда  
 SELECT ... FROM Table1 T1 INNER JOIN Query2 Q2 ON (T1.Id = Q2.Id)


Наверх

Титульная страница Поиск, карта сайта Написать письмо