Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Приветствую,

вот переношу хранимое представление из Access 2000 в MS SQL Server 2000
Запрос:

SELECT
a.ID,
a.Client,
(select SUM(InvoiceAmount) from tblInvoices where tblInvoices.ClientID = a.ID) AS NachislenoCalc,
(select SUM(PaymentAmount) from tblPayments where ClientID = a.ID) AS OplachenoCalc,
(NachislenoCalc - ISNULL(OplachenoCalc, 0)) AS DolgCalc
FROM tblMain AS a

Проблема в том, что в отличие от Access SQL, T-SQL не хочет принимать выражение последнего поля. Требуется замена имен полей их вычисляемыми подзапросами.
Очень неудобно и громоздко получится.
Есть ли какие-нибудь варианты?
MS SQL Server 2005, 2008 интересно тоже имеет данный недостаток?
5 сен 09, 13:19    [7621763]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Иван Абрамов,

select *, (NachislenoCalc - ISNULL(OplachenoCalc, 0)) AS DolgCalc from
(
  SELECT 
    a.ID, 
    a.Client, 
    (select SUM(InvoiceAmount) from tblInvoices where tblInvoices.ClientID = a.ID) AS NachislenoCalc, 
    (select SUM(PaymentAmount) from tblPayments where ClientID = a.ID) AS OplachenoCalc
  FROM tblMain AS a
)
5 сен 09, 13:27    [7621776]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Нда... очень неудобно.
А что, без "вьюхи на лету", а так как в Access было теперь ни как нельзя даже в MS SQL 2008 ?
5 сен 09, 14:19    [7621840]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Иван Абрамов
Нда... очень неудобно.
А что, без "вьюхи на лету", а так как в Access было теперь ни как нельзя даже в MS SQL 2008 ?

там нет вьюхи раз, by designe два.
5 сен 09, 14:22    [7621844]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Спасибо, дорогие.

1. Когда селект в скобках идет в перечислении полей и возвращает одно значение, у нас говорят это подзапрос.
2. Когда селект в скобках идет в секции FROM и возвращает много полей и записей, у нас говорят это "вьюха на лету".

А как правильно надо говорить?
5 сен 09, 14:33    [7621858]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
2. derived table
там много ещё чего ... BOL почитайте.
А что так на 2000 MSSQL ? он же с поддержки уже снят.
5 сен 09, 14:45    [7621878]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Я хочу, чтобы в моих программах была возможность работы с любым MS SQL Server, от 2000 и выше.
5 сен 09, 14:53    [7621896]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Иван Абрамов
Я хочу, чтобы в моих программах была возможность работы с любым MS SQL Server, от 2000 и выше.

Наполеоновские планы , а что же 6 ,6.5, 7 не включили в список ?
Кста 2005 и 2008 имеют значительные отличия от 2000.
5 сен 09, 15:05    [7621911]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Как бы не быстрее
;WITH 
aggInvoiceAmmount 
AS
(
 SELECT SUM(InvoiceAmount) [SUM] , ClientID from tblInvoices 
 GROUP BY ClientID 
)
,aggPaymentAmount
AS
(
 SELECT SUM(PaymentAmount) [SUM] , ClientID from tblPayments 
 GROUP BY ClientID 
)
SELECT
 tblMain.* -- явно поля перечислять надо
 ,aggInvoiceAmmount.[SUM]
 ,aggPaymentAmount.[SUM]
 ,ISNULL(aggInvoiceAmmount.[SUM],0) - ISNULL(aggPaymentAmount.[SUM], 0)
FROM tblMain
 LEFT JOIN aggInvoiceAmmount ON aggInvoiceAmmount.ClientID = tblMain.ID
 LEFT JOIN aggPaymentAmount ON aggPaymentAmount.ClientID = tblMain.ID
но план расставит всё на свои места.
5 сен 09, 15:19    [7621921]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
А индексы полей нельзя указать в выражении последнего поля?
7 сен 09, 14:06    [7626588]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
руки проч от клавивтуры. И где тут "индексы полей в выражении последнего поля." ?
7 сен 09, 14:11    [7626612]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Вот в ORDER BY можно указать индекс поля, а не его имя?
Я спрашиваю, можно ли указать индексы полей, в данном выражении
(NachislenoCalc - ISNULL(OplachenoCalc, 0)) AS DolgCalc в моем селекте в первом посте?

И что значит "руки проч от клавивтуры"?
7 сен 09, 14:20    [7626673]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Иван Абрамов
Вот в ORDER BY можно указать индекс поля, а не его имя?

Нет, это не индекс поля. Это порядковый номер выражения из списка в SELECT
7 сен 09, 14:23    [7626693]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Да, я имею в виду порядковый номер поля или выражения (а не индексы для увеличения быстродействия).
7 сен 09, 14:33    [7626777]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Иван Абрамов
Да, я имею в виду порядковый номер поля или выражения (а не индексы для увеличения быстродействия).

порядковый номер выражения можно использовать только в ORDER BY
7 сен 09, 14:34    [7626794]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
В справке есть все ответы
7 сен 09, 14:36    [7626803]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Иван Абрамов
Да, я имею в виду порядковый номер поля или выражения (а не индексы для увеличения быстродействия).

много чего можно сказать про неудобно.
но тут это неудобство не замечаешь, когда привыкнешь, потому как все структурировано.. а не в циферках все..
7 сен 09, 14:37    [7626812]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
в нектором коде , можно увидеть такие перлы
SELECT 
*
FROM dbo.V_Prikaz 
ORDER BY 5

забавны результаты когда во вьюшке очерёдность полей меняют )))
7 сен 09, 14:40    [7626839]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Иван Абрамов
Member

Откуда:
Сообщений: 319
Да, согласен, лучше, когда все явно указано. Но вопрос, все таки не в этом.
Привыкнуть можно ко всему, что мы и делаем постоянно, покуда деваться не куда.
На мой взгляд, выражение в первом посте гораздо более компктное и удобное, чем выражение во втором. Я об этом неудобстве знал еще 7 лет назад.
И почему до сих пор нет такой возможности указывать алиасы полей в последующих выражениях?
Что мешало разработчикам СУБД MSSQL2008 добавить поддержку данной конструкции?
7 сен 09, 14:52    [7626942]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Иван Абрамов

И почему до сих пор нет такой возможности указывать алиасы полей в последующих выражениях?
Что мешало разработчикам СУБД MSSQL2008 добавить поддержку данной конструкции?

Спросите в форуме разработчиков MSSQL
7 сен 09, 14:53    [7626960]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> И почему до сих пор нет такой возможности указывать алиасы полей в
> последующих выражениях?
> Что мешало разработчикам СУБД MSSQL2008 добавить поддержку данной
> конструкции?

идеология. считается, что все значения в селект-листе вычисляются
одновременно.

Posted via ActualForum NNTP Server 1.4

7 сен 09, 14:55    [7626973]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Иван Абрамов

1. И почему до сих пор нет такой возможности указывать алиасы полей в последующих выражениях?
2. Что мешало разработчикам СУБД MSSQL2008 добавить поддержку данной конструкции?


1. область видимости.
2. вопрос к Билли.
7 сен 09, 14:55    [7626978]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

вот Ицик Бен-Ган, например, пишет:
Inside MS SQL Server 2005 - T-SQL Querying

Aliases created by the SELECT list cannot be used by earlier steps. In fact, expression aliases cannot even be used by
other expressions within the same SELECT list. The reasoning behind this limitation is another unique aspect of SQL,
being an all-at-once operation. For example, in the following SELECT list, the logical order in which the expressions
are evaluated should not matter and is not guaranteed: SELECT c1 + 1 AS e1, c2 + 1 AS e2. Therefore, the following
SELECT list is not supported: SELECT c1 + 1 AS e1, e1 + 1 AS e2. You're allowed to reuse column aliases only in steps
following the SELECT list, such as the ORDER BY stepfor example, SELECT YEAR(orderdate) AS orderyear ... ORDER BY orderyear.


Posted via ActualForum NNTP Server 1.4

7 сен 09, 14:59    [7627007]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
автор
You're allowed to reuse column aliases only in steps
following the SELECT list, such as the ORDER BY stepfor example

а в каких еще можно?

для спящего время бодрствования равносильно сну
7 сен 09, 15:15    [7627140]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли избежать повторения выражений?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> You're allowed to reuse column aliases only in steps
> following the SELECT list, *such as* the ORDER BY step for example
>
> а в каких еще можно?

ну, во внешнем же запросе можно. :)

Posted via ActualForum NNTP Server 1.4

7 сен 09, 15:25    [7627255]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить