gpt4 book ai didi

SQL 查询帮助 : Probably Involves Group By

转载 作者:行者123 更新时间:2023-12-04 05:34:43 27 4
gpt4 key购买 nike

我的软件在几个数据库上运行,所以我需要通用(值得注意的是,我认为“不同”的解决方案可能有效,但这不是标准的)。

假设我有两个表定义为:

Table A: id, time (pk: id)
Table B: id(fk), key, value (pk: id, key)

其中表 B 的 id 是表 A 的外键,主键是指定的。

我需要所请求 key 的最新(及时)值。所以,假设我有这样的数据:
id | key | value
1 | A | v1
1 | B | v2
1 | C | v3
2 | A | v4
2 | C | v5
3 | B | v6
3 | D | v7

id 的时间在增加,我想要键 A 和 C 的值,我希望结果如下:
key | value
A | v4
C | v5

或者对于键 D 和 A:
key | value
D | v7
A | v4

理想情况下,我只会为 n 个关键请求取回 n 行。单个查询可以实现这样的事情吗?

最佳答案

我假设没有 ID 值具有相同的 TIME 值。

我相信以下内容与您可以选择在尽可能多的数据库上运行一样通用。但是对平台灵活性的权衡并没有达到最佳性能。

带有别名 t 的子查询标识每个键可用的最新时间。

select a.id,
a.time,
b.key,
b.value
from tableB as b
inner join tableA as a
on a.id=b.id
inner join (
select b2.key,
max(a2.time) time
from tableB as b2
inner join tableA as a2 on a2.id=b2.id
group by b2.key
) as t on a.time = t.time and b.key = t.key
where b.key in ('D','A')

WHERE 子句可以移动到子查询中,它在具有原始优化器的数据库上的性能可能稍好一些。但是将 WHERE 子句放在外部查询中可以更容易维护,并且也保留了创建没有 WHERE 子句的 View 的可能性。然后可以将 WHERE 子句添加到 View 中的选择中。

使用 ROW_NUMBER() 的查询会更有效,或者使用 Oracle 的 KEEP LAST 之类的查询会更好。但是这些功能会使查询对某些平台更具限制性。

关于SQL 查询帮助 : Probably Involves Group By,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com