Форум: "Базы";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
ВнизМожно ли сделать SQL запрос внутри Дельфи к результатам запроса в Найти похожие ветки
← →
theEnter (2002-10-14 08:55) [0]Можно ли сделать SQL запрос внутри Дельфи к результатам запроса выполненного на сервере?
:-) Дело в том что когда я делаю обыкновенный запрос к SQL Server , то иногда мне нужно эти результаты обработать более детально, а бегать в цикле по полям ADOQuery1.Fields[i] неудобно - ведь результат запроса - таблица и к ней логичнее применить SQL запрос ! Заранее спасибо!
← →
Max Zyuzin (2002-10-14 09:04) [1]Можно.
А в чем собственно проблема? select * from (select * from mytab)... Кстати все запросы делаются на сервере...
← →
AngeL B. (2002-10-14 09:13) [2]
> 2 Max Zyuzin:
Вид в каком это предлагаешь ты, приведет к многократному выполнению вложенного запроса на сервере. Если этот запрос велик, то опаньки. Выполнить же запрос к уже сформированному запросу можно только создавая временную таблицу, и помещая туда результаты первоначального запроса.
← →
boogier (2002-10-14 09:22) [3]Обычно это делается через временную таблицу, хранимую на сервере, которая в конце обработки удаляется
← →
theEnter (2002-10-14 09:22) [4]AngeL B. : А как создавать временную таблицу и главное как указать ее имя в slq запросе ? SELECT Field1 FROM ???
← →
Johnmen (2002-10-14 09:23) [5]Пересмотреть логику "запроса из запроса" и сконструировать один единственный запрос !
← →
theEnter (2002-10-14 09:31) [6]Пусть ADOQuery1 - первоначальный запрос к SQL Server"у
теперь DataSource1.DataSet:=ADOQuery1;
Пробовал например пользоваться компонентом TQuery :
Query1.DataSource:=DataSource1;
Но что писать в тексте SQL запроса ?
Незнаю что делать дальше - а то что делал раньше - просто интуитивный поиск решения моей проблемы :-)
← →
theEnter (2002-10-14 09:33) [7]Johnmen © : Меня интересует именно проблема запроса из запроса! :-) Если кто знает - подскажите, пожалуйста!
← →
theEnter (2002-10-14 09:36) [8]boogier © : В том то и дело что я не хочу обращаться на сервак после первого запроса и хочу все остальные запросы( к результатам первого запроса) проводить на клиенте! :-)
← →
Johnmen (2002-10-14 09:37) [9]Тогда у тебя один выход - фильтрация !
← →
theEnter (2002-10-14 09:42) [10]Johnmen © : А подробнее, если можно ? Просто я новичок в программировании баз данных и для меня слово фильтрация мало что значит,sorry! :-) Заранее спасибо!
← →
Max Zyuzin (2002-10-14 09:46) [11]>AngeL B. (14.10.02 09:13)
Что то я не понял в каком месте будет многократное выполнение запроса... к тому же на сервере все делается (должно) по определению быстрее, а в третих, не сичтаю менее трудоемким процесс перекачки сначала кучи данных на клиента, с последуещей их закачкой в память и обработкой... я думаю "опаньки" раньше произойдет с клиентом.
SQL Сервер на то и сервер, что бы передавать только необходимую информацию клиенту... а ваш подход превращает его в файл сервер.
>theEnter
А вообще лучше воспользоваться советом Johnmen © (14.10.02 09:23)
← →
Ал (2002-10-14 09:49) [12]create temp table
создается временная таблица
потом обзіваешь ее как хочешь, заполняешь
и обращаешься в SELECT-е так, как ты ее обозвал.
знаю не по-наслышке, сама использовала
← →
Johnmen (2002-10-14 09:54) [13]>theEnter
По поводу фильтрации набора данных см. свойства Filter, Filtered, метод OnFilterRecord...
А еще лучше - почитай умную книжку...:)))
← →
theEnter (2002-10-14 10:01) [14]Johnmen © : Спасибо! :-) <особенное за ключевые слова :-)>
← →
Reindeer Moss Eater (2002-10-14 10:06) [15]Что бы не заполнять временную таблицу данными, удобнее создавать не ее, а просмотр
← →
MishaH (2002-10-14 10:11) [16]В ADOQuery есть свойство Recordset - к нему можно применить фильтр: ADOQuery.Recordset.Filter = "Field like ""%ля-ля%"" and ...". Убрать фильтр: ADOQuery.Recordset.Filter = ""
Это не поможет (писал по памяти, остальное есть в справке)
← →
22606 (2002-10-14 11:10) [17]Если даже допустить, что ...
> ...результат запроса - таблица и к ней логичнее применить SQL запрос ...
То у тебя на компьютере по крайней мере должен быть сервер, который этот запрос обработает.
А вообще для начала хотя-бы сообщи с каким сервером ты работаешь - Oracle, IB...(а может вообще с локальными таблицами ???), где запущен сервер (на локальной машине или выделенной, как часто будет выполняться такой запрос)
Если отбросить вероятность того, что данную операцию "Ы" нельзя выполнить в рамках одного запроса (а скорее всего все-таки можно), то мне больше нравится предложение Reindeer Moss Eater с применением View, если конечно используемый сервер дает такую возможность.
То есть вместо Select"a создаешь View, а потом к нему обращаешься как к таблице. View , кстати, можно и не удалять, если данная операция ("Ы") :-) будет часто выполняться.
← →
Max Zyuzin (2002-10-14 11:14) [18]>22606 © (14.10.02 11:10)
Внимаетельнее читай вопрос, там указан сервер MSSQL. Предложение со View разумно, но возможно все можно офрмить одним запросом...
← →
22606 (2002-10-14 11:16) [19]Сорри, не заметил, что в вопросе ты указал сервер - MSSQL.
Тогда нет никаких препятствий - создавай View.
Хотя, повторюсь, возможно можно и в рамках одного запроса все сделать.
← →
22606 (2002-10-14 11:26) [20]Да, спасибо, Max Zyuzin © , я уже после своего ответа это увидел, но и Вы внимательнее читайте ответ :-) - оба раза я предположил, что скорее всего все можно оформить в один запрос.
Но очень часто бывает, что и первичный запрос очень навороченный и быстрее сделать два, чем втолковать серверу в одном запросе чего от него хотят.
← →
passm (2002-10-14 11:37) [21]22606 © (14.10.02 11:26)> Разбиение запросов на просмотры нужно не столько серверу сколько пользователю/программисту для облегчения его понимания/написания, многократного использования и предоставления защищенных данных пользователям (правильное применение запросов уменьшает вероятность несанкционированного доступа к данным).
← →
theEnter (2002-10-14 11:39) [22]22606 © :
>Тогда нет никаких препятствий - создавай View
Вы имеете в виду создать View на сервере? Исли так тогда - Чем это лучше простого обращения к Серверу обычным запросом ? Если не понял - извините, но всетаки проблема осталась: как мне указать что источником для запроса Query является другой запрос ADOQuery ?
← →
passm (2002-10-14 11:47) [23]theEnter (14.10.02 11:39)> Тебе все равно не сделать то, что ты хочешь - запрос выполняется на сервере и над данными расположенными в БД. Выполнить запрос на результат - это фантастика :-).
Тебе же народ предлагает конструкцию:
SELECT T1.*
FROM (SELECT Q1...
FROM TABLE1 AS Q1) AS T1(FIELD1,.. FIELD_N)
Вложенный запрос наз-ся.
← →
22606 (2002-10-14 11:51) [24]Если вопрос стоит именно так, то никак.
Здесь Вы, скорее всего, представляете, что первый запрос выполнился и выполнять его вторично нет смысла, то это не совсем так, так как результаты первого запроса все-равно хранятся на сервере до того момента, пока Вы не вытяните его на клиента, а как кто-то здесь уже отвечал (кстати тот-же Max Zyuzin ©), это может быть более долгим и ресурсоемким, чем выполнить все на сервере - то-ли одним запросом то-ли с помощью View.
← →
theEnter (2002-10-14 11:54) [25]passm ©: Что такое вложеный запрос я знаю, но зачем тогда в TQuery поле DataSource ?
← →
ЮЮ (2002-10-14 11:56) [26]Для организации связи Master-Detail. Разве в Helpe об этом не написано???
← →
passm (2002-10-14 12:01) [27]theEnter (14.10.02 11:54)> Для автоматической установки типа/значений параметров в запросе. Т. е. если в запросе Query1 имеется параметр "PARAM1" и указан DataSource, то перед открытием/исполнением если в источнике DataSource будет найдено поле PARAM1, то фактически выполнится Query1.ParamByName("PARAM1").AssignField(FieldByName(DataSource.DataSet.FieldByName("PARAM1")))
← →
Max Zyuzin (2002-10-14 12:07) [28]>22606 © (14.10.02 11:26)
;о)
← →
mtihonov (2002-10-15 06:24) [29]Рассмотри следующее предложение:
В текущем Connecte (это обязательно) создаешь временную таблицу
SELECT Field1,Field2,...
INTO #TempTableName
FROM MyTable
WHERE <Условия>
Для данного Connect"а будет создана временная таблица. Для этого Connect"а ее имя будет #TempTableName, на самом деле ее имя будет #TempTableName___________XXXXX. Далее можешь работать с этой временной таблицей:
SELECT Field1,Field2,...
FROM #TempTableName
WHERE <Условия>
После закрытия Connect"а таблица #TempTableName будет автоматически уничтожена. Эта таблица видна только в данном Connect"е для тебя. Если хочешь чтобы временная таблица была видна другим пользователям - назови ее ##TempTableName.
Насчет уничтожения такой таблицы ничего сказать не могу - не проверял. Читай Help по MS SQL.
← →
perov (2002-10-15 07:51) [30]есть компоненты, которые делают запросы из любого датасета. (правда я ими не пользовался)
← →
theEnter (2002-10-15 10:07) [31]perov © : Интересно а что это за компоненты ? Если нестандартные, то где их можно взять ?
← →
perov (2002-10-15 10:59) [32]отправил на мыло.
← →
MegaBass (2002-10-15 12:09) [33]проще TClientDataset там есть BeforeGetRecord --OwnerData
можешь передавать на сервер любые данные
я делаю так с дополнительными WHERE условиями.
← →
SeB (2002-10-15 17:27) [34]2petrov
А нельзя ли поподробнее про компоненты, которые делают запросы из датасета? Где скачать можно?
← →
Adony (2002-10-16 10:32) [35]2 mtihonov
это не совсем то, что требуется.
т.к. таблица все-равно будет создана на сервере :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.009 c