2010-10-22 66 views
4

我试着进行下面的查询:SELECT AS问题

SELECT t1.[user1], t1.[user2], 
    (CAST(t1.[total_event_duration] AS DECIMAL))/(CAST (t2.[total_events_duration] AS DECIMAL)) AS buddy_strength 
FROM [CDRs].[dbo].[aggregate_monthly_events] AS t1 
INNER JOIN [CDRs].[dbo].[user_monthly_stats] AS t2 
    ON t1.[user1] = t2.[user1] 
WHERE buddy_strength > 0.02 

但它返回一个错误“无效的列名称buddy_strength'”

有谁知道如何解决上面的查询?

回答

7
SELECT * 
FROM 
    (
    SELECT 
     t1.[user1], t1.[user2],(CAST(t1.[total_event_duration] AS DECIMAL))/(CAST (t2.[total_events_duration] AS DECIMAL)) AS buddy_strength 
     FROM [CDRs].[dbo].[aggregate_monthly_events] AS t1 
      INNER JOIN [CDRs].[dbo].[user_monthly_stats] AS t2 
       ON t1.[user1] = t2.[user1] 


    ) foo 
     WHERE foo.buddy_strength > 0.02 
+0

适用于普遍适用的快速修复。 – egrunin 2010-10-22 13:47:37

+0

+1与重复整个表达式相比,这会有性能优势吗? – Patrick 2010-10-22 14:17:45

+0

@帕特里克:不,在这种情况下,它是有效的短路 – gbn 2010-10-22 16:51:49

3

您不能在where,group byhaving子句中使用别名。您可以通过在一个子查询包裹它解决这个问题:

SELECT * FROM (
    SELECT 
     t1.[user1], 
     t1.[user2], 
     (CAST(t1.[total_event_duration] AS DECIMAL)) 
      /(CAST (t2.[total_events_duration] AS DECIMAL)) 
      AS buddy_strength 
    FROM [CDRs].[dbo].[aggregate_monthly_events] AS t1 
    INNER JOIN [CDRs].[dbo].[user_monthly_stats] AS t2 ON t1.[user1] = t2.[user1] 
) a 
WHERE a.buddy_strength > 0.02 

否则,你将不得不再次进行键入整个事情,这是没有好处的。

+1

*您可以*在ORDER BY ... – gbn 2010-10-22 13:45:17

+0

至于我记得别名在'ORDER BY'中确定。 – a1ex07 2010-10-22 13:45:33

+0

你是对的。用更准确的信息编辑。 – 2010-10-22 13:50:36

5

您不能在WHERE子句中使用别名。你需要重复整个表达式(CAST(t1.[total_event_duration] AS DECIMAL))/(CAST (t2.[total_events_duration] AS DECIMAL)>0.02)。

2

您不能在where子句中使用别名列。我认为你必须要重现导出字段的值在where子句中,像这样的:

SELECT t1.[user1], t1.[user2],(CAST(t1.[total_event_duration] AS DECIMAL))/(CAST (t2.[total_events_duration] AS DECIMAL)) AS buddy_strength 
    FROM [CDRs].[dbo].[aggregate_monthly_events] AS t1 
     INNER JOIN [CDRs].[dbo].[user_monthly_stats] AS t2 
      ON t1.[user1] = t2.[user1] 
    WHERE (CAST(t1.[total_event_duration] AS DECIMAL))/(CAST (t2.[total_events_duration] AS DECIMAL)) > 0.02