2017-03-04 56 views
-1

我试图找到carid,它已将绝大多数旅程用于不同的客户。我不想要一个完整的解决方案,因为我有一个关于如何去做的想法。但是,当我运行查询我得到的错误:SQL查询正确性

Table 'test.v' doesn't exist 
1 statement failed. 

我的SQL查询:

SELECT * FROM (
    (
     SELECT carid, COUNT(DISTINCT cusid) AS counter 
     FROM trips 
     GROUP BY carid 
    ) v 
) 
WHERE v.counter = (
     SELECT MAX(counter) 
     FROM v 
) 

当我选择v.counter=2我得到正确的结果。任何人都可以解释我发生了什么?

+3

MySQL或SQL Server? – GurV

+0

如果你的问题是关于MS SQL Server的,你可以使用['with'](https://msdn.microsoft.com/en-us/library/ms175972.aspx)或['over'](https:// msdn.microsoft.com/en-us/library/ms189461.aspx)来完成。有了MySQL,[回复@GurV](http://stackoverflow.com/a/42591833/5221149)可能是最好的选择。 – Andreas

回答

1

在MySQL中,你不能直接使用那样的别名。您将需要重新编写子查询。

试试这个:

select * 
from (
    select carid, count(distinct cusid) as counter 
    from trips 
    group by carid 
    ) v 
where v.counter = (
     select max(counter) 
     from (
      select count(distinct cusid) as counter 
      from trips 
      group by carid 
      ) t 
     ) 

目前尚不清楚你正在使用的DBMS。如果您使用SQL Server,则可以使用CTE:

with v 
as (
    select carid, count(distinct cusid) as counter 
    from trips 
    group by carid 
    ) 
select * 
from v 
where counter = (
     select max(counter) 
     from v 
     ) 
+0

这是为什么?是不是v已经创建为临时表时,从执行语句执行,并在那之后where子句可以引用v表? –

+0

@Varun - 是临时表创建的,但它不可用于这样的查询。它已被查询。如果您使用SQL Server(在答案中添加了一个示例),则一种选择是使用CTE(公用表表达式)。 – GurV