来自OpenQuery结果的SQL语句中的“无效的列名”错误

时间:2008-09-05 17:26:38

标签: sql sql-server

我正在尝试通过链接的SSAS服务器执行SQL查询。初始查询工作正常:

SELECT "Ugly OLAP name" as "Value" 
FROM OpenQuery( OLAP, 'OLAP Query')

但如果我尝试添加:

WHERE "Value" > 0

我收到错误

  

无效的列名称“值”

任何想法我可能做错了什么?


所以问题是处理查询元素的顺序与编写它们的顺序不同。根据这个消息来源:

http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx

MSSQL中的评估顺序是:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. 选择
  8. ORDER BY
  9. 因此,在WHERE和HAVING子句之后才会处理别名。

4 个答案:

答案 0 :(得分:17)

这应该有效:

SELECT A.Value
FROM (
SELECT "Ugly OLAP name" as "Value" 
FROM OpenQuery( OLAP, 'OLAP Query')
) AS a
WHERE a.Value > 0

值不是保留字,问题是它是列别名,而不是列名。通过使其成为内联视图,“Value”成为列名,然后可以在where子句中使用。

答案 1 :(得分:6)

您使用“Value”作为列别名,我不认为别名可以出现在where子句中。它只是用于命名返回的列值。您的where子句应引用原始列名:

SELECT "Ugly OLAP name" as "Value" 
FROM OpenQuery( OLAP, 'OLAP Query')
WHERE "Ugly OLAP name" > 0

答案 2 :(得分:0)

哦,真可惜。我刚刚看到,你选择AS FOO。在这种情况下,你不需要一个HAVING克劳斯吗?

SELECT whatever AS value FROM table HAVING value > 1;

我仍然不会使用“价值”。但是可以肯定的是,在你的文档中查找它!

答案 3 :(得分:0)

我可以保证将它从GROUP BY中删除。好消息是,它可以很好地成为一个简单的旧选择别名。