Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-11112
theEnter
2002-10-16 12:36
2002.11.04
Как узнать какая запись выделена в dbgrid ?


6-11362
BAHO
2002-09-03 00:39
2002.11.04
Трафик


1-11237
Corte ™
2002-10-25 12:58
2002.11.04
Доброе время суток. Вопрос.


6-11371
_sMile
2002-09-05 18:10
2002.11.04
InternetCheckConnection


7-11501
frum
2002-08-19 09:53
2002.11.04
WIN XP - процессы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский