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:是的,很多地方都提到了LIMIT
和FETCH
。 TOP
在段落中只有一次: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