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

Вниз

Запрос в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
3-81546
Dripus
2003-07-30 16:25
2003.08.25
TQuery и Win98.


1-81677
Zheks
2003-08-11 16:50
2003.08.25
Типизированный файл


1-81818
Comrad
2003-08-14 10:31
2003.08.25
Как открыть проект сделанный в Дельфи6 в Д5?


1-81606
Сергеич
2003-08-15 12:20
2003.08.25
Обработка ошибок


14-81905
Velocity
2003-08-01 09:48
2003.08.25
хитрости формата XLS (Excel 97)





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