Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1396866815
lewka_s
2014-04-07 14:33
2015.09.10
путь к файлу dxExEdtr.dcu


2-1395331412
Дмитрий
2014-03-20 20:03
2015.09.10
Как отключить у ДБТекстБокса копирование в буфер


6-1276713309
np-600
2010-06-16 22:35
2015.09.10
Делфи и удалёная БД


15-1417524936
И. Павел
2014-12-02 15:55
2015.09.10
Уроки по программированию


15-1418713981
Pavia
2014-12-16 10:13
2015.09.10
Регулярные выражения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский