在sql server中,为什么我们在比较来自两个表的数据时不能使用函数

时间:2015-03-17 06:32:24

标签: sql sql-server max

有人可以告诉我以下查询有什么问题

select 1 
from table1 a, 
table2 b 
where a.pdate=max(b.pdate)

没有编译。

编写此查询的另一种方法是

set @pdate=pdate from table2
select 1 
from table1 a, 
table2 b
where a.pdate=max(b.pdate)

但我想了解第一个查询的错误。

由于

2 个答案:

答案 0 :(得分:2)

  

但我想了解第一个查询的错误。

错误消息会告诉您可能对您有价值的事情。

  

聚合可能不会出现在WHERE子句中,除非它在a中   包含在HAVING子句或选择列表中的子查询以及列   被聚合是一个外部参考。

max()函数是一个返回一组行的最大值的聚合。 where子句用于过滤行。因此,如果您在进行过滤的位置使用聚合,则不清楚您实际想要哪些行的最大值。

重写可能如下所示:

select 1 
from dbo.table1 as a 
where a.pdate = (
                select max(b.pdate)
                from dbo.table2 as b
                );

答案 1 :(得分:0)

即使是第二次查询也是错误的。

正确的方式,

Select @pdate=max(pdate) from table2

select 1 
from table1 a where a.pdate=@pdate

,或者

select 1 
    from table1 a where a.pdate=(Select max(pdate) from table2)

如果你提到除聚合列之外的其他列名,那么你可以使用group by