Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

Запрос в MS SQL Server   Найти похожие ветки 

 
Nikolai_S ©   (2003-07-28 16:37) [0]

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

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

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

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


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

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


 
KSergey ©   (2003-07-28 17:29) [2]

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


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

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


 
Nikolai_S ©   (2003-07-28 17:46) [4]

> 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:48) [5]

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

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

В смысле???


 
KSergey ©   (2003-07-28 17:49) [6]

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


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


 
sniknik ©   (2003-07-28 18:42) [7]

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)
> И потом наверняка увеличится время выполнения запроса.
а ты проверял? по моему так это будет самый быстрый вариант (повторить дважды).


 
Nikolai_S ©   (2003-07-28 19:02) [8]

> sniknik © (28.07.03 18:42)

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

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

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


 
sniknik ©   (2003-07-28 20:06) [9]

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

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


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

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


 
KSergey ©   (2003-07-29 12:17) [11]

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

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


 
Nikolai_S ©   (2003-07-30 16:44) [12]

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


 
handra ©   (2003-07-30 17:16) [13]

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


 
sniknik ©   (2003-07-30 17:18) [14]

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


 
sniknik ©   (2003-07-30 17:20) [15]

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


 
Nikolai_S ©   (2003-07-30 17:45) [16]

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



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

Текущий архив: 2003.08.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
14-81943
Norlin
2003-08-07 00:28
2003.08.25
Художники отзовитесь!!


1-81747
TButton
2003-08-09 21:17
2003.08.25
TMemo (брат :) )


14-81964
chs2r
2003-08-06 14:37
2003.08.25
Кто знает где скачать шаровой литерытуры по делфям?


1-81703
Yuraz
2003-08-11 11:17
2003.08.25
Как в Font.Color = clBlac вместо clBlack написать цифрами (0,0,0)


1-81788
Duncan
2003-08-13 16:38
2003.08.25
Кто работает с Fast Report.