Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Шмрокое использование вложенного запроса в IN   Найти похожие ветки 

 
kaif ©   (2004-04-29 16:30) [0]

Вот пытаюсь сделать как бы "виртуальные папки", в которые продвинутый юзер мог бы вписать запрос к справочной системе в моей программе. Например, есму хочется "все принтеры" HP собрать в одну папку "для удобства". чтобы он мог записать что-то вроде SELECT ID FROM ... WHERE ... = "HP".
 Однако сама система управления справочниками достаточно сложная. Так вот есть идея сделать так:
 Система свой автоматический хитрый и навороченный запрос дополняет в условии WHERE простым подзапросом пользователя. Так как все справочние элемены образуют общее пространство ID, получается так:

 SELECT
   ....
 FROM
   ....
   ....
   ....
 WHERE
   ....
   ....
   AND ID IN (<запрос пользователя, возвращающий значения ID>)

Можно ли пойти по этому пути? Пока я получил замедление запросов всего процентов на 10 по сравнению с "оптимальным запросом" (без подзапроса). Но это пока на 10тыс. записях в справочной системе.


 
kaif ©   (2004-04-29 17:06) [1]

Приведу пример

SELECT
 GOODS.ID GOODS_ID,
 GOODS.ARTICLE_OLD,
 GOODS.ARTICLE,
 GOODS.MANUFACTURER,
 O1.SHORT_NAME MANUFACTURER_LK,
 GOODS.PRICE1,
 GOODS.PRICE2,
 GOODS.PRICE3,
 GOODS.MARK,
 BED_CLOTHES.BED_DECOR,
 O2.SHORT_NAME BED_DECOR_LK,
 PILLOW_CASE.PILLOW_CASE_KIND,
 O3.SHORT_NAME PILLOW_CASE_KIND_LK
FROM
 GOODS,
 OBJECT_NAMES O1,
 BED_CLOTHES,
 OBJECT_NAMES O2,
 PILLOW_CASE,
 OBJECT_NAMES O3
WHERE
 GOODS.MANUFACTURER=O1.OBJECT_ID AND
 GOODS.ID=BED_CLOTHES.ID AND
 BED_CLOTHES.BED_DECOR=O2.OBJECT_ID AND
 GOODS.ID=PILLOW_CASE.ID AND
 PILLOW_CASE.PILLOW_CASE_KIND=O3.OBJECT_ID AND
 GOODS.ID IN (SELECT OBJECT_ID FROM OBJECT_NAMES WHERE SHORT_NAME LIKE "%65x%")AND
 GOODS.ID IN (SELECT OBJECT_ID FROM OBJECT_NAMES WHERE SHORT_NAME LIKE "%прош%")

ORDER BY GOODS.ID


Выделенный код - 2 подзапроса пользователя. Он как бы создал папку, в которой хочет видеть все наволочки с размером "65x" и добавил еще одну "дочернюю папку", в которой останутся все такие наволочки, но к тому же "прошитые". Фильтацию пользователь сделал на основе вхождения в наименование SHORT_NAME. Я как бы вставил из каждой папки подзапрос в основной запрос, сужая тем самым результирующее множество записей.

Время запроса с одним дополнительным условием 0.070 сек, а с двумя - уже 0.35 сек на процессоре 850 МГц.


 
Sandman25+1   (2004-04-29 17:19) [2]

Почему нет? Особенно если предусмотреть "библиотеку виртуальных папок" для наиболее полезных папок. И возможно обработку специальных идентификаторов типа CurrentUser, BeginOfCurrentYear, BeginOfCurrentMonth, CurrentOffice и т.д., причем обработка и конвертация в SQL может вестись в Delphi, чтобы не заставлять пользователя учить тяжелый SQL.


 
kaif ©   (2004-04-29 18:40) [3]

А кто реализовывал подобные вещи? Меня интересует Ваш опыт. Юзеры такие примочки вообще используют? Или им милее папки-коллекции, в которые можно что-то просто складывать? То есть будут ли юзеры вообще рады виртуальным папакам-фильтрам? Вот в Outlook2003 такие папки вроде есть. Но я не знаю пока никого, кто бы юзал Outlook2003. Есть ли смысл вообще заморачиваться?


 
Petr V. Abramov ©   (2004-04-29 19:11) [4]

IMHO, тормоза из-за LIKE "%65x%"


 
Sandman25+1   (2004-04-30 13:45) [5]

[3] kaif ©   (29.04.04 18:40)

Сожалею, у меня подобного опыта нет.
Хотя видел, что бывают пользователи, которые осваивают довольно сложные вещи. Но, конечно, только если эти сложные вещи необходимы или в конечном итоге облегчают повседневную работу.


 
kaif ©   (2004-04-30 23:40) [6]

Странно, что SQL считается чем-то сложным.
 По-моему IBM в свое время изобрела этот язык именно для юзеров...
 Как же они свой бизнес делают, если SQL для них сложен?


 
Sergey Masloff   (2004-05-01 00:41) [7]

kaif ©   (30.04.04 23:40) [6]
>Как же они свой бизнес делают, если SQL для них сложен?
очень хорошо обычно делают. И всякой чушью себе головы не забивают ( и правильно делают). Потому что SQL прост только на простых примерах. И мне в страшном сне не приснится пускать юзера с SQL-ем в руках к моей базе. Ну серьезно... Нельзя так.


 
Narayan ©   (2004-05-01 11:58) [8]

юзер с SQL-ем в руках не так уж страшен, его ж можно в правах ограничить


 
kaif ©   (2004-05-01 14:40) [9]

2 Sergey Masloff   (01.05.04 00:41) [7]
 Ну а почему? Если мы используем только метод Open компонента типа TIBDataSet, то никакие опасные команды (insert, delete, update, grant, create, alter, drop) попросту не сработают.
Юзер может использовать простые запросы. А сложные при нормальной организации данных и не нужны. К тому же если речь идет о фильтрации справочников, а не о получении финансовых отчетов, то, ИМХО, ничего здесь опасного нет. Максимум, чем мы рискуем - юзер будет задавать вопросы, "почему я написал такой запрос, а там такие элементы не видны, которые я бы хотел, чтобы были видны". Получив ответ на такой вопрос, юзер уже обучается SQL. Что, собственно и требуется. А если вопрос ламерский - можно послать к "руководству по SQL для простых смертных", которое опубликовать в документации.


 
Sergey Masloff   (2004-05-01 21:56) [10]

kaif ©   (01.05.04 14:40) [9]
> Ну а почему? Если мы используем только метод Open компонента >типа TIBDataSet,
Я не в этом смысле. 2 примера. Таблица a - 150 тыс. записей. Таблица b - 30 тас записей

первый: запрос вида

 select a.id from a where a.shortname like "%x%"


второй: запрос вида

 select a.id, b.id from a, b


Обе эти команды вроде бы и не опасны, но на IB они могут уложить сервер на полчасика работы со 100% загрузкой процессора. К чему это приведет в многопользовательской среде когда экономист запустил такое а в кассу стоит десяток людей которые очень торопятся объяснять думаю не надо. А виноват будешь ты - твоя система такое позволяет!

>А сложные при нормальной организации данных и не нужны
Ну, с этим можно спорить но это уже Holy War а я в них стараюсь не принимать участия. (получается не всегда)


 
Petr V. Abramov ©   (2004-05-01 22:12) [11]

Кстати, как это ни странно, среднему человеку проще написать на чем-то типа 1сMudLang, чем на SQL, хоть и будет в 10 раз длинне, кривее и тормознее.
 По моим наблюдениям над людьми, считающими, что программирование - это просто и лезущими что-то исправить :)


 
kaif ©   (2004-05-01 23:08) [12]

2 Sergey Masloff   (01.05.04 21:56) [10]
 Убедил. Я совершенно забыл про декартово произведение. Видимо, действительно юзеру непосредственно в SQL делать нечего. :(
 Или нужен хитрый парсер, анализирующий такие промахи. Овчинка выделки явно не стоит... Спасибо.



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

Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.035 c
7-1082103065
Ruslan
2004-04-16 12:11
2004.05.23
Как отследить изменение в конфигурации компьютера?


1-1084176269
BillyJeans
2004-05-10 12:04
2004.05.23
как определить какая из клавиш мышки нажата над TMenuItem?


1-1084030723
Крутыш
2004-05-08 19:38
2004.05.23
Как очистить буфер


8-1078499463
artix
2004-03-05 18:11
2004.05.23
крутящаяся земля


14-1083656290
GanibalLector
2004-05-04 11:38
2004.05.23
ДОС версии ниже 6.22.





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