如何在不使用GROUP BY子句的情况下获取列值

时间:2018-05-02 10:35:57

标签: select sql-server-2012 group-by aggregate-functions

我想用从VHSTATUS表中检索到的最新时间更新VHMAIN表。我写了如下的查询

select a.vehi_id,a.statustime,a.vhstatus,max(b.statustime) 
newstatustime,b.vhstatus newstatus
from vhmain a inner join vhstatus b on a.vehi_id=b.vehi_id2 
group by a.vehi_id,a.statustime,a.vhstatus having 
a.statustime<>max(b.statustime)

我收到错误

  

列'vhstatus.vhstatus'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

如果我在GROUP BY子句中添加'vhstatus.vhstatus',整个数据将会出错

请建议我查询

修改:表格和预期结果数据

VHMAIN
vehi_id   statustime  vhstatus
38        2004-03-08      9

VHSTATUS
vehi_id2  statustime  vhstatus
38        2004-03-11  55  
38        2004-03-08  55  
38        2004-03-08  9

Expected result
vehi_id   statustime  vhstatus    newstatustime newstatus
38        2004-03-08  9            2004-03-11     55

3 个答案:

答案 0 :(得分:0)

确定。您是否尝试过嵌套查询?

例如:

select tbl.*, department.Name
from department 
  inner join (
     select departmentId, COUNT(*) cnt
     from employees
     group by departmentId 
) AS tbl on tbl.departmentId = department.Id

答案 1 :(得分:0)

这是你可以做到的:

  warning enumeration value GRASS,WATER,STREET bit handled in switch

上面未经测试的代码Buildings.cpp bool Buildings::isBuildable(Field::FieldType type) { switch(type) { case Field::HOME: return true; case Field::TOWNHALL: return false; } } Properties.cpp bool Properties::isBuildable(Field::FieldType type) { switch(type) { case Field::GRASS: return true; case Field::WATER: return false; case Field::STREET: return false; } } update VHMAIN set VHMAIN.vhstatus = VHSTATUS.vhstatus from VHMAIN inner join VHSTATUS on VHMAIN.vehi_id = VHSTATUS.vehi_id2 where VHSTATUS.statustime = (select top 1 vhs.statustime from VHSTATUS.statustime vhs where vhs.vehi_id2 = VHSTATUS.vehi_id2 order by vhs.statustime desc); 来自select的最新statustime项,并在外部命令中对VHSTATUS进行检查,以便您准确找到项目您正在搜索,然后statustime updateVHMAIN

答案 2 :(得分:0)

select  tbl.*,x.vhstatus from vhstatus x inner join (select 
a.vehi_id,a.statustime,a.vhstatus,max(b.statustime) newstatustime from vhmain a
inner join vhstatus b on a.vehi_id=b.vehi_id2 group by 
a.vehi_id,a.statustime,a.vhstatus  having max(a.statustime) 
<>max(b.statustime)) tbl on tbl.newstatustime=x.statustime and 
tbl.vehi_id=x.vehi_id2  order by tbl.vehi_id