Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать дублирования запросов? 
:(
    Опции темы
AndreyK
Дата 16.3.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Вот, например у меня есть элемент запроса:

Код

CASE WHEN (SELECT ...)>0 THEN (SELECT ...) ELSE 0 END AS MMM


Внутри CASE стоит один и тот же запрос - типа ,если он возвращает отрицательное число, то столбец MMM должен равняться нулю, в противном случае он равнен числу, полученному в (SELECT ...)

Я не уверен, что SQL сервер догадается , что это один и тот же SELECT и не будет выполнять его дважды.

Но что мне сделать, чтоб этот SELECT упоминался в конструкции только один раз?
Мне ничего в голову не приходит.

(Хранимые процедуры не подходят - я как раз от них должен избавиться)
PM MAIL   Вверх
Zloxa
Дата 16.3.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Код

select case when val > 0 then val else 0 end as resutl
from (select 
               (select ...) as val
      ) s



Это сообщение отредактировал(а) Zloxa - 16.3.2011, 17:38


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyK
Дата 16.3.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Спасибо, работает ....

А что означает " s" в конце запроса?

(Без неё не работает)
PM MAIL   Вверх
Zloxa
Дата 16.3.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(AndreyK @  16.3.2011,  18:06 Найти цитируемый пост)
А что означает " s" в конце запроса?

алиас подзапроса

Цитата(AndreyK @  16.3.2011,  18:06 Найти цитируемый пост)
(Без неё не работает) 

я тоже нахожу это абсурдным


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 16.3.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Zloxa @  16.3.2011,  19:07 Найти цитируемый пост)
я тоже нахожу это абсурдным 

Гм... почему? любой источник записей должен иметь имя. По-моему...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 16.3.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



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

Это сообщение отредактировал(а) Zloxa - 16.3.2011, 18:35


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 16.3.2011, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Zloxa @  16.3.2011,  19:23 Найти цитируемый пост)
безусловное требование предпринимать действия к разрешению конфликтов при отсутствии даже гипотетической возможности таковых, я нахожу странным.

Необходимость предотвращения конфликта имён - это общее.
Отсутствие конфликта в определённом типе запросов - это частное.
Какой смысл заниматься специальной обработкой особых случаев, если при соблюдении общих норм они правильно обрабатываются общей процедурой? тем более что никакого оверхеда это не порождает...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 16.3.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Akina @  16.3.2011,  18:53 Найти цитируемый пост)
Какой смысл заниматься специальной обработкой особых случаев

Akina, не могу примпомнить, в MS SQL алиасинг столбцов обязателен? Помоему нет. Вернее в подзапросах -  да, в запросах - нет. Мне лично кажется что обязательный алиасинг столбцов куда более насущная необходимость нежели обязательный алиасинг подзапросов. Как обратиться с клиента к столбу select 3.14? 

Если честно, мне кажется, что ограничение, о котором мы гвоорим, сделано майкрософтом по причинам, отличным от эстетических или же идеологических.


Это сообщение отредактировал(а) Zloxa - 16.3.2011, 22:24


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
AndreyK
Дата 17.3.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



За себя могу сказать, что если бы не этот алиас, то я бы ,наверное, методом тыка нашел этот вариант решения ... но на все мои подобные попытки сервер выдавал непонятные ошибки ...
Ни за что бы не догадался, что надо обязательно алиас указывать.

Сейчас вот думаю над еще одним вариантом:

Код

CASE WHEN SUM(Kolvo*Stoim) >0 THEN SUM(Kolvo*Stoim) ELSE 0 END


Здесь уже стоит не SELECT , а агрегатная функция SUM.
Но тут ,я думаю, сервер уже сможет догадаться и правильно оптимизировать  работу.

Наверное можно ничего не менять.

PM MAIL   Вверх
Zloxa
Дата 17.3.2011, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(AndreyK @  17.3.2011,  00:21 Найти цитируемый пост)
Наверное можно ничего не менять.

Думаю, поменяв, вы сэкономите спички. Вычисление суммы нельзя назвать трудоемкой операцией.

Если предыдущий подзапрос не корелирован, скорее всего и он выполнялся лишь единожды и наша оптимизация бесполезна. Более того, нет никакой гарантии, что изменив форму запроса, избавившись от двойного подзапроса, мы  избавились и от двойного исполнения. По кр. мере за ораклю я бы не поручился, мс же, вроде, малость подеревяннее в этом плане, но мало ли, всяко может быть, тут тоже оптимизатор достаточно наворочен и к нему нужен свой подход. 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.