Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос в MS SQL Server


Nikolai_S ©   (2003-07-28 16:37:00) 

Почему в запросах MS SQL Server нельзя ссылаться на алиасы вычисляемых полей? Например в запросе

SELECT [F1] + [F2] AS [ALIAS_SUM], [ALIAS_SUM] * [F3] FROM [MY_TABLE]

выдается ошибка:
Invalid column name "ALIAS_SUM".

Данный пример простой. Реально же вычисляемое поле гораздо сложнее и повторять его дважды - это слишком громоздко. И потом наверняка увеличится время выполнения запроса. В MS Access подобная вещь нормально работает...


Nikolai_S   (2003-07-30 17:45:00) [1]

> sniknik © (30.07.03 17:20)
Ну я так тоже сделал, благо Access в отличие SQL Server разрешает алиасы вычисляемых полей подставлять, чтобы не пришлось все огромное выражение по два раза вставлять :-)


sniknik   (2003-07-30 17:20:00) [2]

:о)) а вернее наоборот. ну поймеш.


sniknik   (2003-07-30 17:18:00) [3]

такой удобной с заменой по моему нет (не знаю)
делал так
iif(IsNull(VarExpr),VarExpr,0)


handra   (2003-07-30 17:16:00) [4]

Nikolai_S © (30.07.03 16:44)
А есть ли аналог функции IsNull в MS Access?
Там есть тоже функция IsNull(VarExpr), но она аналогично выражению [MyField] IS NULL.
увы - нет


Nikolai_S   (2003-07-30 16:44:00) [5]

А есть ли аналог функции IsNull в MS Access?
Там есть тоже функция IsNull(VarExpr), но она аналогично выражению [MyField] IS NULL.


KSergey   (2003-07-29 12:17:00) [6]

Еще такая проблема есть - когда складываем два поля, одно из которых NULL, то результат всегда тоже NULL.

Это не проблема, это документированное поведение.


Nikolai_S   (2003-07-29 10:35:00) [7]

Нет, я поначалу делал через case. Про функцию IsNull не знал. Спасибо за информацию.


sniknik   (2003-07-28 20:06:00) [8]

> Но это такой громадный запрос тогда получается. Его визуально невозможно понять.
конечно как удобнее, но запросы можно делать многострочными и форматированными. видел такие (сам пока обходился) что целая программа в одном запросе...

> Еще такая проблема есть - когда складываем два поля, одно из которых NULL, то результат всегда тоже NULL.
не такая уж большая проблема
UnitPrice+Quantity
=
isNull(UnitPrice,0)+isNull(Quantity,0)
также делаеш?


Nikolai_S   (2003-07-28 19:02:00) [9]

> sniknik © (28.07.03 18:42)

Ну вообще похоже, что действительно время запроса не увеличивается, если дважды повторить выражение. Но это такой громадный запрос тогда получается. Его визуально невозможно понять. Я через View все сделал - так хоть понятнее и меньше вероятность ошибки при правках.

Но вот почему SQL Server через алиасы не дает обращаться - это не понятно :-( . Access нормально съедает такие запросы...

Еще такая проблема есть - когда складываем два поля, одно из которых NULL, то результат всегда тоже NULL. Приходится каждое поле проверять и если оно NULL, то подставлять 0. Тоже занудное занятие. Хотя здесь своя логика, конечно, присутствует.


sniknik   (2003-07-28 18:42:00) [10]

Fay (28.07.03 17:48)
>> Сравнить быстродействие пока не могу, т.к. база данных пустая
>> Данный вариант тоже громоздкий.
В смысле???
тест на базе Northwind 2155 записей
SELECT UnitPrice+Quantity as ALIAS_SUM, (UnitPrice+Quantity)*Discount as [ЧЁ-ТО] FROM Invoices
время выполнения 08-09 мск.

с подзапросом как у тебя
SELECT [ALIAS_SUM] = Q.[ALIAS_SUM], [ЧЁ-ТО] = Q.[ALIAS_SUM]*Q.[Discount]
FROM (SELECT [ALIAS_SUM] = UnitPrice+Quantity, Discount FROM [Invoices] ) Q
время выполнения 12-14 мск.
и чем больше записей в таблице тем разница будет ощутимей

(вот это и значит "громоздкий")

Nikolai_S © (28.07.03 16:37)
> И потом наверняка увеличится время выполнения запроса.
а ты проверял? по моему так это будет самый быстрый вариант (повторить дважды).


KSergey   (2003-07-28 17:49:00) [11]

Nikolai_S © (28.07.03 17:46)
Не охота их все через View.


А кого это интересует? Надо федя, надо... ;)


Fay   (2003-07-28 17:48:00) [12]

>> Сравнить быстродействие пока не могу, т.к. база данных пустая

>> Данный вариант тоже громоздкий.

В смысле???


Nikolai_S   (2003-07-28 17:46:00) [13]

> KSergey © (28.07.03 17:29)
Я остановился пока на View. Хотя у меня сотня таких запросов. Не охота их все через View.

> Fay (28.07.03 17:09)
Данный вариант тоже громоздкий. К тому же у меня очень сложный запрос и поле вычислется на основе полей из разных таблиц. Таким образом мне кажется не менее громоздко будет.

> Fay (28.07.03 17:31)
Сравнить быстродействие пока не могу, т.к. база данных пустая. Вбиваю по несколько записей для проверки запросов и все. Хотя догадываюсь, что через View гораздо быстрее будет.


Fay   (2003-07-28 17:31:00) [14]

>>И потом наверняка увеличится время выполнения запроса
А проверить?


KSergey   (2003-07-28 17:29:00) [15]

А еще есть View для таких вот дел...


Fay   (2003-07-28 17:09:00) [16]

Ку?
SELECT
[ALIAS_SUM] = Q.[ALIAS_SUM],
[ЧЁ-ТО] = Q.[ALIAS_SUM]*Q.[F3]
FROM
(SELECT
[ALIAS_SUM] = [F1] + [F2],
[F3]
FROM [MY_TABLE]
) Q


Наверх

Титульная страница Поиск, карта сайта Написать письмо