跨表的 SQL VALUES 和 MAX
Posted
技术标签:
【中文标题】跨表的 SQL VALUES 和 MAX【英文标题】:SQL VALUES and MAX across tables 【发布时间】:2021-11-05 19:55:07 【问题描述】:我遇到了一个 DB2 数据库查询问题。 我们有三个表,每个表都有自己的“最后更新时间戳”(LST_UPDT_TS)。 我们需要使用在三个表中的任何一个中找到的最新时间戳按此时间戳对表进行排序。 据我所知,推荐的方法是使用“VALUES”构建一个微型内部表并选择最新的一个,将其作为合并记录的时间戳。
SELECT
a.CUST_ID as CUSTOMER_ID,
(
SELECT MAX(LST_UPDT_TS)
FROM ( VALUES(
(a.LST_UPDT_TS),
(b.LST_UPDT_TS),
(c.LST_UPDT_TS)
) as VALUE(LST_UPDT_TS)
)
) as LST_UPDT_TS
FROM TableA as a
JOIN TableB as b ON b.CUST_ID = a.CUST_ID
JOIN TableC as c ON c.CUST_ID = a.CUST_ID
从我在 *** 上找到的其他解决方案中可以看出,这是使用 SELECT 和 VALUES 命令的正确格式,但我得到的不是单个最大值,而是...
SQL0104N 在“(”之后发现了意外的令牌令牌“(”。预期的令牌可能包括:“.JOIN INNER LEFT RIGHT FULL CROSS”。SQLSTATE=42601 (#-104)
任何帮助将不胜感激。
谢谢!
【问题讨论】:
为什么不直接使用MAX (a.LST_UPDT_TS, b.LST_UPDT_TS, c.LST_UPDT_TS)
而不是这个子选择?
Mark - 坦率地说,尽管我不得不经常使用 SQL,但我对 SQL 并不是那么好。我很担心,因为我确实忽略了所有表都相当大,并且我确实需要以 1000 个为一组来将结果发送到远程请求程序。当我必须执行“和(组合的最大 ts)>“(上一批的最后一个 ts)按(组合的 ts)ASC 仅获取前 1000 行的顺序”时,此解决方案是否有效?
是的,它会起作用的。这是一个序数标量函数,可以在任何表达式和子句中使用该调用,包括您提到的那些。
非常感谢!!
【参考方案1】:
也许是这样的?
SELECT CUSTOMER_ID,MAX(LST_UPDT_TS)LST_UPDT_TS
from(
SELECT a.CUST_ID as CUSTOMER_ID,MAX(a.LST_UPDT_TS) LST_UPDT_TS FROM TableA as a group by a.CUST_ID
UNION
SELECT b.CUST_ID as CUSTOMER_ID,MAX(b.LST_UPDT_TS) LST_UPDT_TS FROM TableB as b group by b.CUST_ID
UNION
SELECT c.CUST_ID as CUSTOMER_ID,MAX(c.LST_UPDT_TS) LST_UPDT_TS FROM TableC as c group by c.CUST_ID
) d GROUP BY CUSTOMER_ID
ORDER BY 2 DESC
FETCH FIRST ROW ONLY
【讨论】:
以上是关于跨表的 SQL VALUES 和 MAX的主要内容,如果未能解决你的问题,请参考以下文章