2015-06-21 56 views
0

我试图得到的结果为Microsoft SQL Server上的类似查询列名的FROM子句:SQL服务器:具有与在那里与选择“为”

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

但是,我不能使用的专栏中,我在SQL Server中选择了“AS”。服务器根本不知道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的工作。这个语法在任何实现窗口函数的DBMS中都不能正常工作,因为别名可以引用“having”后面计算的表达式。 –

+0

我的天啊。我不想再重复这个表达方式,认为它会重做这个操作,因为它是一个有一些负载的paranthesis。但根据你的解释,似乎没有选择: -/ – cenk

+0

意思是说,在where子句和连接完成后,任何结果都会被过滤以查看它们是否通过having子句设置的条件。经常用于计数或总计查询,您只希望查看大于某种条件的结果。在你提供的例子中使用没有意义。你想要一个带有和子句的地方。 –