Главная страница
    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.008 c
14-81929
Feshik
2003-08-06 14:12
2003.08.25
Нажать кнопку или ввести текст в чужом окне


14-81949
VEG
2003-08-05 19:05
2003.08.25
Нужен ли человечеству ИИ???


1-81664
ХМЛ-щик
2003-08-08 14:53
2003.08.25
XPath. Как разрулить между двойными и одинарными кавычками?


14-81915
Иван Шихалев
2003-07-27 19:48
2003.08.25
---|Ветка была без названия|---


3-81575
Yuraz
2003-07-30 14:24
2003.08.25
Как подключить в ADOConnection UDL файл, но чтобы компонент





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