![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос с использованием имен других 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)