2011-07-27 56 views
1

我试图将条件添加到我的select语句中,但我得到无效的列名异常。SQL Server中的列名无效

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

但是,如果我尝试添加:

WHERE "Value" > 0 

你建议我必须使用原来的名字,它工作正常。

但如果我不能使用原来的列名遵循

SELECT 
    ROW_NUMBER() OVER(PARTITION BY P.ProviderID 
         ORDER BY T.PostedUTC DESC, T.TransactionID DESC) as RN 
FROM 
    Provider p 
INNER JOIN 
    Transaction T 
WHERE 
    RN = 1 

如何访问RN我哪里???

+0

你错过了'... ON p.xxxx = T.xxxxx'加入你的'INNER JOIN'行的JOIN条件.... –

回答

0

你必须重复原来的计算

0

的另一种方式,使这个更容易理解是重写查询为一系列的CTE的 - 通用表表达式。它们的外观和行为类似于“迷你本地视图”,您可以在其中重命名列等。从您给出的示例来看,这很困难,但通常您可以在后续查询中重写复杂的查询并返回具有更好名称的列。

1

你可以这样来做:

WITH T AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY P.ProviderID ORDER BY T.PostedUTC DESC, T.TransactionID DESC) as RN 
    From Provider p Inner join Transaction T 
) 
SELECT RN 
FROM T 
WHERE RN > 0; 

编辑:错过了问题第二个查询...

0

你需要使用一个CTE或派生表:

​​

;WITH CTE AS 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY P.ProviderID 
          ORDER BY T.PostedUTC DESC, T.TransactionID DESC) as RN, 
      [More Columns] 
    FROM Provider p 
    INNER JOIN Transaction T 
    ON SomeCondition 
) 
SELECT * 
FROM CTE 
where RN = 1