Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Запрос к БД, но данные не нужны :)   Найти похожие ветки 

 
ПЛОВ ©   (2015-01-15 09:33) [0]

Вопрос скорее по SQL. Вообщем, есть некий запрос, написуемый самим пользователем, что там он получает из БД мне на данном этапе не интересно. Нужно получить ТОЛЬКО Field-ы этого запроса, без данных. Что лучше всего дописать в конце запроса (ну типа ... AND TRUE=FALSE) чтобы СУБД сразу понимала что "кина не будет" и не делала никаких выборок?


 
junglecat ©   (2015-01-15 09:42) [1]

ну так сам себе и ответил)


 
pavel_guzhanov ©   (2015-01-15 09:46) [2]

обычно в таких случаях пишу and 1 = 2


 
ПЛОВ ©   (2015-01-15 10:02) [3]

ага, ясно-понятно, так я и думал :) тогда всем спасибо


 
jack128 ©   (2015-01-15 10:52) [4]

"select  * from table" если дописать в конец " and 1 = 2" то что нить получится??


 
kilkennycat ©   (2015-01-15 11:05) [5]

Нет. Надо бы хотя бы where добавить :)


 
ухты ©   (2015-01-15 11:07) [6]

[4] + еще много вариантов (order by, group by ...)

если запрос типа селекта, то обернуть еще одним, с процедурами сложнее..


 
Ega23 ©   (2015-01-15 11:13) [7]

select * from ( Запрос_Пользователя) where 1=0


 
pavel_guzhanov ©   (2015-01-15 11:34) [8]


> если дописать в конец " and 1 = 2" то что нить получится?
> ?

Жень, ну ведь ты же понимаешь, что это пишется в WHERE в том случае, если уже есть какое-то условие. Ну а если там условия нет, то WHERE 1 = 2


 
Ega23 ©   (2015-01-15 11:44) [9]


> Жень, ну ведь ты же понимаешь, что это пишется в WHERE в
> том случае, если уже есть какое-то условие. Ну а если там
> условия нет, то WHERE 1 = 2


Тут как раз и возник спор. Ну, типа, надо писать парсер, дабы гарантированно узнать, есть ли в пользовательском запросе where, или нет. Т.е. решение для общего случая.
Но потом пришло в голову [7] и на этом спор завершился.


 
pavel_guzhanov ©   (2015-01-15 11:55) [10]


> Ega23 ©   (15.01.15 11:44) [9]

Понял.

На прошлой работе в системе собирался запрос из полей и условий с наследованием. Для того, чтобы не возникало вопросов, каким образом заполнять в наследниках WHERE, у самого верхнего предка обязательно указывалось: WHERE 1 = 1.
Но это не получится в том случае, если запрос пользователя не собирается из выбранных им полей и условий, а просто пишется в редакторе, в таком случае  - [7]


 
ПЛОВ ©   (2015-01-15 12:07) [11]

Наличие WHERE и его расположение или добавление я конечно же буду проверять... Меня интересовало с точки зрения оптимизации что лучне написать


 
Ega23 ©   (2015-01-15 12:40) [12]


> Наличие WHERE и его расположение или добавление я конечно
> же буду проверять..


[7]


 
Ega23 ©   (2015-01-15 12:41) [13]


> Для того, чтобы не возникало вопросов, каким образом заполнять
> в наследниках WHERE, у самого верхнего предка обязательно
> указывалось: WHERE 1 = 1.


угу, тоже так делал. Но это не есть "произвольный пользовательский запрос"  :)


 
Дмитрий С ©   (2015-01-15 13:03) [14]

Как насчет LIMIT 0 и удалить ORDER, если есть?


 
кгшзх ©   (2015-01-15 13:04) [15]

один я помню про TFieldDefs.update без извратов с where и открытия датасета?


 
Ega23 ©   (2015-01-15 13:09) [16]


> Как насчет LIMIT 0 и удалить ORDER, если есть?


Да хоть динамический запрос.


 
Ega23 ©   (2015-01-15 13:11) [17]

один я помню про TFieldDefs.update без извратов с where и открытия датасета?

Это не общий случай.


 
ПЛОВ ©   (2015-01-15 13:43) [18]

[7]

а не получится ли так, что сначала будет долго и нудно выолнятся подзапрос?


 
ухты ©   (2015-01-15 13:47) [19]

если только сам запрос долгий и нудный


 
pavel_guzhanov ©   (2015-01-15 14:47) [20]


> Как насчет LIMIT 0

это тоже

> не общий случай.


 
кгшзх ©   (2015-01-15 15:29) [21]

Это не общий случай.

Это как раз совсем очень общий случай.
А если кто-то думает что прикрутить к where заведомо ложное условие - это всегда пара пустяков, то тот видимо не видел запросов сложнее select * from table where x=y


 
pavel_guzhanov ©   (2015-01-15 15:34) [22]


> Это как раз совсем очень общий случай.

а где-то в вопросе говорилось про Delphi?


 
Дмитрий С ©   (2015-01-15 15:36) [23]

В документации Mysql так и написано:
http://www.mysql.ru/docs/man/LIMIT_optimisation.html


5.2.8 Как MySQL оптимизирует LIMIT

В некоторых случаях, когда используется LIMIT # и не используется HAVING, MySQL будет выполнять запрос несколько иначе:

Если при помощи LIMIT выбираются только несколько строк, MySQL будет использовать индексы в тех некоторых случаях, когда он обычно предпочел бы делать полное сканирование таблицы.
Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу.
При сочетании LIMIT # с DISTINCT MySQL остановится, как только найдет # уникальных строк.
В некоторых случаях группировка GROUP BY может быть выполнена путем упорядоченного считывания ключа (или путем выполнения сортировки по ключу) и последующего вычисления итогового результата пока не изменится значение ключа. В этом случае LIMIT # не будет вычислять какие-либо ненужные предложения GROUP BY.
После того как MySQL пошлет первые # строк клиенту, он прервет выполнение запроса (если не используется SQL_CALC_FOUND_ROWS).
LIMIT 0 всегда будет быстро возвращать пустую выборку. Эта команда полезна для проверки запроса и получения типов столбцов результата.
Если сервер для выполнения запроса использует временные таблицы, LIMIT # применяется для вычисления того, сколько для них потребуется места.


 
кгшзх ©   (2015-01-15 15:44) [24]

а где-то в вопросе говорилось про Delphi?

а при чем здесь говорилось?

юзер пишет запрос.
где-то.
например на доске в классе или в экселе.

тебе надо получить его метаданные.
Берешь датасет, берешь запрос и получаешь их через TFieldDefs.

только не говори, что и метаданные нужны тому кто пишет запрос


 
Ega23 ©   (2015-01-15 15:49) [25]


> Это как раз совсем очень общий случай.


Это НЕ общий случай, LIMIT далеко не во всех диалектах есть.

И не забываем про такой возможный вариант:

CREATE PROCEDURE S_Foo
@Param int = 0
As

if @Param = 0
 select IntValue = 0

if @Param = 1
 select GUIDValue = newid()

if @Param = 2
 select StrValue = "RhsvYfi!"

if @Param = 3
 select DateTimeValue = getdate()

if @Param = 4
 select * from sysobjects

go



И на клиенте запрос: "exec S_Foo @Param=:param";
Запрос параметризованный, всё чики-пики.


 
Ega23 ©   (2015-01-15 15:50) [26]


> Берешь датасет, берешь запрос и получаешь их через TFieldDefs.


В общем случае не сработает.


 
кгшзх ©   (2015-01-15 15:53) [27]

Это НЕ общий случай, LIMIT далеко не во всех диалектах есть.


лимит было не от меня предложено.
тут вообще кто-нибудь буквы в ветках читает?

В общем случае не сработает.
Конечно. Например нет электричества - не сработает.


 
pavel_guzhanov ©   (2015-01-15 16:16) [28]


> юзер пишет запрос.
> где-то.
> например на доске в классе или в экселе.
>
> тебе надо получить его метаданные.

А у меня нет Delphi вообще. И не знаком я с ним. И какой же это


 
pavel_guzhanov ©   (2015-01-15 16:17) [29]

Не на ту кнопку нажал в предыдущем сообщении. Завершаться оно должно было словами "И какой же это совсем общий случай?"


 
кгшзх ©   (2015-01-15 16:41) [30]

так нахрена задавать загадки а не вопросы?

сейчас выяснилось что у тебя нет делфи.
через пять минут скажешь что у тебя нет манаджмент студии, или девелопера.
впрочем можно сказать что и компа у тебя нет, а нужен универсальный случай.

в общем просто хочется потрендеть после праздников


 
кгшзх ©   (2015-01-15 16:44) [31]

Что лучше всего дописать в конце запроса

дописать надо ложное условие,
но перед этим найти куда именно его вставить в исходный запрос.

и пока четко угадывается, что ты думаешь, что это пустяковая задача.

ну ну.


 
ПЛОВ ©   (2015-01-15 17:24) [32]

Уточню. Да, Делфи. Юзер пишет свой запрос в диалоговом окне, а не на доске :) СУБД - ФБ. Запросы будут как раз вроде select * from ... ну максимум с всякими join -ами, тоесть простейшие.
Задача получить поля запроса и показать их пользователю чтобы он мог выбрать, из какого поля запроса куда кидать информацию (а именно, в поля некоего "отчета", придуманные самим же пользователем).


 
кгшзх ©   (2015-01-15 17:26) [33]

select * from (
<user_select>
)
where 1=2


 
кгшзх ©   (2015-01-15 17:27) [34]

или если идеологически правильно, то TFieldDefs.Update


 
Ega23 ©   (2015-01-15 17:33) [35]


> или если идеологически правильно, то TFieldDefs.Update


У TIBSQL нет TFieldDefs например


 
Ega23 ©   (2015-01-15 17:34) [36]


> кгшзх ©   (15.01.15 17:26) [33]


см [7].


 
кгшзх ©   (2015-01-15 17:42) [37]

У TIBSQL нет TFieldDefs например

Ну естественно ты умный. Нету.
И естественно для отчетов надо юзать именно НЕ наследника TDataSet. Для удобства

Носил квадратное, круглое катал, в цирке не смеешься?


 
кгшзх ©   (2015-01-15 17:48) [38]

У TIBSQL нет TFieldDefs например

а может у него филддефсов нету, но поля есть?

ну типа в спец билде для сержантов/ефрейторов.

У кнопки тоже филдефсов нету - какой неуниверсальный способ предложил кгшзх



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.055 c
3-1304500823
Atum
2011-05-04 13:20
2015.09.10
Сделать запись в поле CLOB


15-1421340945
Fox
2015-01-15 19:55
2015.09.10
Ранжирование игр на Google Pkay


11-1259909126
MTsv DN
2009-12-04 09:45
2015.09.10
Работа с меню...


15-1411754150
Jeer
2014-09-26 21:55
2015.09.10
О детях, внуках и что мы им..


15-1413646158
tomkat
2014-10-18 19:29
2015.09.10
не запускается Delphi