Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизЗапрос к БД, но данные не нужны :) Найти похожие ветки
← →
ПЛОВ © (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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.049 c