SQL:将更新与分组结合起来?

Posted

技术标签:

【中文标题】SQL:将更新与分组结合起来?【英文标题】:SQL: combine update with group-by? 【发布时间】:2012-04-17 08:35:01 【问题描述】:

我有两张桌子:

events:

mac | na
----------
abc | (null)
abc | (null)
def | (null)

enrichments:

mac | na  | timestamp
---------------------
abc | na1 | 1
abc | na2 | 2
abc | na3 | 3
def | na4 | 1

现在我想用enrichments.na 中的值更新events.na 列,其中mac 匹配,timestamp 是该特定timestamp 的最大值mac

对于这个例子,结果是:

abc | na3
abc | na3
def | na4

最有效的方法是什么?

谢谢!

【问题讨论】:

那就是 HyperSQL (HSQLDB)。 为什么events表中有2个相同的行? @ypercube:因为我没有包含不相同的列。 【参考方案1】:
UPDATE events AS e
SET na = 
    ( SELECT n.na
      FROM enrichments AS n
      WHERE n.mac = e.mac
      ORDER BY n.timestamp DESC
      FETCH FIRST 1 ROWS ONLY
    ) 

【讨论】:

感谢您提供正确手册的链接。我没有看到澄清数据库系统的评论,因为我正在写我的答案。 @AndriyM:你为什么删除你的答案。它可能工作正常。 因为它与你的基本相同,只是我不知道正确的语法(因为我不知道 OP 使用的是什么产品)。您已经很好地找到了正确的手册,因此您的答案应该保留。 刚刚注意到您在我的回答的评论末尾添加了 '和 TOP'。对不起,但我在手册中找不到你给我的链接。 FETCH FIRST 和 LIMIT 存在,但 TOP 不存在。不过,我可能正在寻找in the wrong place。 @AndriyM:是的,很多地方都提到了LIMITFETCHTOP 在段落中只有一次:Standards Support。我想知道是否允许。【参考方案2】:

这应该适用于使用公共表表达式的 SQL Server

create table events (mac nvarchar(3), na nvarchar(3))
insert into events values ('abc',null);
insert into events values ('abc',null);
insert into events values ('def',null);

create table enrichments (mac nvarchar(3), na nvarchar(3), timestamp int)
insert into enrichments values ('abc','na1',1)
insert into enrichments values ('abc','na2',2)
insert into enrichments values ('abc','na3',3)
insert into enrichments values ('def','na4',1)

with latestEnrichment (mac, latestTimestamp) as
    (select mac, MAX(timestamp)
    from    enrichments
    group by mac)
update  events
set     na = en.na
from    events e join enrichments en on e.mac = en.mac
        join latestEnrichment le on en.timestamp = le.latesttimestamp and
        en.mac = le.mac

【讨论】:

以上是关于SQL:将更新与分组结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

用keil软体如何将汇编与C语言结合起来一起编写微控制器的程式

我可以将 PIVOT 与 Microsoft SQL Server 中的内部联接结合起来吗?

如何将一个字段中的日期与另一字段中的时间结合起来 - MS SQL Server

Angularjs列表项边距问题将ng-repeat元素与静态元素结合起来

SQL Oracle - 将连续行与过滤器结合起来

在 T-SQL 中将变量表与单个变量结合起来