2015-06-21 1 views
0

Я пытаюсь получить результаты для подобного запроса на Microsoft SQL Server:SQL Server: наличие и где пункты для имен столбцов, выбранных с «как»

SELECT 
    A, B, C AS DANUMBER 
FROM 
    TABLE 
WHERE 
    B = 'SOMEVALUE' 
HAVING 
    DANUMBER > 0 

Однако, я не могу использовать столбец I выбрали с помощью «AS» в SQL Server. DANUMBER просто неизвестен серверу.

Каждый пример, который я искал, информирует о показе агрегатных функций, ничто не решило мою проблему. Этот запрос работает на mySQL, но не на SQL Server.

Я думаю, что может быть не хватает какой-то синтаксис или что-то ...

ответ

0

MySQL расширяет использование пункта HAVING признать псевдонимы столбцов, определенные в SELECT. Вы не можете предположить это поведение в других базах данных (он не работает в SQL Server и Oracle, например, он работает в Postgres). У вас есть три варианта: повторите выражение, используйте подзапрос или используйте CTE.

Первый является лучшим для кода, который может быть запущен как в SQL Server и MySQL:

SELECT A, B, C AS DANUMBER 
FROM TABLE 
WHERE B = 'SOMEVALUE' 
GROUP BY A, B, C 
HAVING C > 0; 

или:

SELECT A, B, C AS DANUMBER 
FROM TABLE 
WHERE B = 'SOMEVALUE' AND 
     C > 0; 
+0

Довольно, что он не работает в Postgres. Этот синтаксис не может работать разумно в любой СУБД, которая реализует функции окна, поскольку псевдоним может ссылаться на выражение, вычисленное после 'наличия'. –

+0

О, мой бог. Я не хотел повторять выражение, думая, что оно переработает операцию, потому что это паранезия с некоторой нагрузкой в ​​ней. но по мере того, как объясняется ваше объяснение, кажется, что выбора нет: -/ – cenk

+0

Имея в виду, что после того, как предложение where и объединения выполняются, любые результаты фильтруются, чтобы узнать, передают ли они условие, заданное условием having. Часто используется в запросе count или sum, где вы хотите видеть только результаты, которые больше, чем какое-либо условие. Использование наличия в приведенном вами примере не имеет смысла. Вы хотите где-то с предложением и. –