Связь нескольких ADOQuery
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
У ADOQuery есть свойство DataSource, определяющее источник данных. У меня есть 2 ADOQuery. В первом выполняется запрос, в котором есть вычисляемые поля. Можноли связать второй ADOQuery С первым и сформировать в нем запрос по данным первого,т.е. в SQL написать например: Select * from ADOQuery1?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
немного поподробнее можно? вам хечется сделать выборку по вычислимым полям первого ADOQuery?
так низя...Select * from ADOQuery1

-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Ну нельзя так нельзя. Тогда можно сохранить результаты первого запроса во временной таблице и по ней уже построить второй запрос. Верно?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Верно.
Кроме того, если второй запрос должен пользоваться вычисляемыми данными не в педложении SELECT, а только в WHERE, то интересен может оказаться также вариант связывания запросов отношением Master-Detail. Временных таблиц не надо, но второй запрос может возвращать данные, которые связаны с вычисляемым полем (т.е. критерием отбора будет вычисленное значение в текущей строке).
А какого рода вычисляемые поля?
Я так понимаю, что используются поля, где вычисление производится обработчиками OnCalculate?
Если это так, то надо задуматься над возможностью вычислений не на клиенте, а на сервере.
Т.е. производить вычисления средствами SQL.
Что это даст?
1) первый запрос можно будет переделать в INSERT INTO TempTable SELECT <bla-bla-bla>. Для сохранения во временной таблице.
2) можно будет вобще без временных таблиц обойтись, так как второй запрос может быть вложенным.
Кроме того, если второй запрос должен пользоваться вычисляемыми данными не в педложении SELECT, а только в WHERE, то интересен может оказаться также вариант связывания запросов отношением Master-Detail. Временных таблиц не надо, но второй запрос может возвращать данные, которые связаны с вычисляемым полем (т.е. критерием отбора будет вычисленное значение в текущей строке).
А какого рода вычисляемые поля?
Я так понимаю, что используются поля, где вычисление производится обработчиками OnCalculate?
Если это так, то надо задуматься над возможностью вычислений не на клиенте, а на сервере.
Т.е. производить вычисления средствами SQL.
Что это даст?
1) первый запрос можно будет переделать в INSERT INTO TempTable SELECT <bla-bla-bla>. Для сохранения во временной таблице.
2) можно будет вобще без временных таблиц обойтись, так как второй запрос может быть вложенным.
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Вот какая штука: есть таблица Table1 в базе. Есть 2 ADOQuery.
В ADOQuery1 пишу:
select pole1,pole2,pole3 into ##Table2
from Table1
where(...)
order by(...)
Здесь создается временная таблица ##Table2 в которую сохранябтся результаты запроса.
В ADOQuery2 пишу:
select *
from ##Table2
Хочу прочитать то что было сохранено.
Вылетает ошибка:
There is already an object name '##Table2' in the dataset
Почему?
В ADOQuery1 пишу:
select pole1,pole2,pole3 into ##Table2
from Table1
where(...)
order by(...)
Здесь создается временная таблица ##Table2 в которую сохранябтся результаты запроса.
В ADOQuery2 пишу:
select *
from ##Table2
Хочу прочитать то что было сохранено.
Вылетает ошибка:
There is already an object name '##Table2' in the dataset
Почему?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Может ошибка вылетает не в мометн выборки вторым запросом, а в момент сохранения первым?
База данных какая используется?
База данных какая используется?
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
База данных на MS SQL Server. А нельзя ли все же не используя временные таблицы как нибыдь составить второй запрос по результатам первого, а то с временными таблицами в моем случае трудно. Почему просто нелязя написать во втором запросе select * from ADOQuery1.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Нельзя, потому что запрос этот будет выполнять SQL Server, а он понятия не имеет, что такое ADOQuery1, так как ADOQurery1 - это имя которое присутствует только в исходном коде вашей программы (и больше нигде) и означает адрес области памяти, где хранится экземпляр объекта, работающего с другим объектом (TADOConnection), представляющим собой инструмент для взаимодействи клиента с сервером.
Вот поэтому-то и нельзя.
Если вычисляемые поля можно вычислить средствами SQL, то можно будет создать на сервере VIEW. А выборку производить из этого VIEW (как из таблицы). Кроме того, можно будет даже написать
SELECT ... FROM (SELECT...) AS TBL1
Я уже спрашивал, какие вычисления производятся в вычисляемых полях.
Надо копать в эту сторону. Это решит много проблем. Все вычисления, которые можно сделать на сервере надо обязательно делать на сервере, а не на клиенте!
Вот поэтому-то и нельзя.
Если вычисляемые поля можно вычислить средствами SQL, то можно будет создать на сервере VIEW. А выборку производить из этого VIEW (как из таблицы). Кроме того, можно будет даже написать
SELECT ... FROM (SELECT...) AS TBL1
Я уже спрашивал, какие вычисления производятся в вычисляемых полях.
Надо копать в эту сторону. Это решит много проблем. Все вычисления, которые можно сделать на сервере надо обязательно делать на сервере, а не на клиенте!