没有为“a”错误的第2列指定列名

时间:2015-03-03 11:19:26

标签: sql-server mssql-jdbc

我有一个MySQL查询,我运行它工作正常,但同样的查询显示SQL Server中的错误。

SQL Server查询:

SELECT 
    COUNT(*) cnt 
FROM 
    (SELECT DISTINCT 
         tc_id, MAX(exn_time), STATUS 
     FROM 
         release_details a, tc_details b  
     WHERE 
         a.project = b.project 
         AND a.tc_id = b.tc_name 
         AND logicaldel = 0 
         AND a.project = 'test' 
     GROUP BY 
         tc_id, STATUS) a 
WHERE 
    a.status = 'PASS';

错误:

  

没有为'a'的第2列指定列名。

如何修改上述查询?

3 个答案:

答案 0 :(得分:4)

使用Alias name作为您的内部查询。您正在获取MAX(exn_time)但未指定该列的名称,这就是抛出错误的原因。并且您可以使用Joins表来使其更具可读性。

SELECT COUNT(*) cnt 
FROM (
     SELECT DISTINCT 
         tc_id,
         MAX(exn_time) AS Maxtime ,
         STATUS 
      FROM 
         release_details a JOIN tc_details b  
           ON a.project= b.project 
             AND a.tc_id = b.tc_name 
      WHERE 
           logicaldel = 0  
           AND a.project ='test' 
      GROUP BY 
         tc_id,
         STATUS 
      ) a 
 WHERE a.status='PASS';

答案 1 :(得分:1)

您错过了在子查询中提供Alias name

同样如Marc_s所述,您需要使用正确的Inner Join,保留连接条件ON子句并将过滤器移至where子句

SELECT Count(*) cnt
FROM   (SELECT DISTINCT tc_id,
                        Max(exn_time) Max_exn_time,
                        STATUS
        FROM   release_details a
               INNER JOIN tc_details b
                       ON a.project = b.project
                          AND a.tc_id = b.tc_name
        WHERE  a.project = 'test'
               AND logicaldel = 0
        GROUP  BY tc_id,
                  STATUS) a
WHERE  a.status = 'PASS'; 

答案 2 :(得分:0)

您的问题显然是结果集中的第二列没有别名。 您可以将整个查询重写为相同的结果:

SELECT
    COUNT(DISTINCT tc_id) cnt
FROM 
    release_details a
JOIN
    tc_details b  
ON
    a.project = b.project 
    AND a.tc_id = b.tc_name 
WHERE
    logicaldel = 0 
    AND a.project = 'test' 
    AND STATUS = 'PASS'

由于STATUS只能有值' PASS',MAX(exn_time)无法帮助您计算,因此在使用group by时,不应该在SELECT的开头使用DISTINCT,就像你的情况一样是多余的