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

Posted

技术标签:

【中文标题】如何在不使用 GROUP BY 子句的情况下获取列值【英文标题】:How to get column value without using in GROUP BY clause 【发布时间】:2018-10-12 10:35:25 【问题描述】:

我想用从 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

【问题讨论】:

请添加相关表格的结构。一些样本数据也不会受到伤害。 更新语句在哪里? @FindOutIslamNow 我猜 George 正在尝试首先选择正确的值,以确保更新实际上会更新预期的记录。 @LajosArpad:使用表格的示例结构进行编辑。 我已经根据您的结构添加了一个答案,但请注意它未经测试。 【参考方案1】:

好的。你试过嵌套查询吗?

例如:

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

【讨论】:

谢谢哥们。我有个主意【参考方案2】:

你可以这样做:

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 来自 VHSTATUS 的具有最新 statustime 的项目,并将其与外部命令中的 statustime 进行检查,以便您准确找到您正在搜索的项目,然后是 @987654326 @VHMAIN 到它的vhstatus

【讨论】:

【参考方案3】:
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

【讨论】:

以上是关于如何在不使用 GROUP BY 子句的情况下获取列值的主要内容,如果未能解决你的问题,请参考以下文章

没有 order by 子句的 Oracle 排序结果集

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?

如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

Postgresql 错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

使用Group By子句的时候,一定要记住下面的一些规则