假设我们有以下带有一些值(时间戳)的 SQLite 表。
CREATE TABLE main_test (
main_id INTEGER PRIMARY KEY,
main_ts INTEGER NOT NULL
);
CREATE TABLE sec_test (
sec_id INTEGER PRIMARY KEY,
sec_ts INTEGER NOT NULL
);
INSERT INTO main_test (main_ts) VALUES(1711670399), (1711583999), (1711497599), (1711411199), (1711151999)
INSERT INTO sec_test (sec_ts) VALUES (1711500000), (1711200000)
这些表中的时间戳不匹配,但我需要从辅助表(sec_test)中选择时间戳,这些时间戳位于第一个表(main_test)的时间戳间隔内,因此结果将如下所示:
main_id|main_ts |sec2_ts |
-------+----------+----------+
1|1711670399| NULL|
2|1711583999|1711500000| -- 1711500000 is between 1711583999 and 1711497599
3|1711497599| NULL|
4|1711411199|1711200000| -- 1711200000 is between 1711411199 and 1711151999
5|1711151999| NULL|
有人知道如何实施吗?初始表(在实际项目中使用)非常大,因此速度很重要。
您可以使用带有子查询的 SQL 查询来查找位于 main_test 表中的 main_ts 值区间内的 sec_ts 值。
SELECT
m.main_id,
m.main_ts,
(
SELECT
s.sec_ts
FROM
sec_test s
WHERE
s.sec_ts < m.main_ts AND
s.sec_ts >= COALESCE((SELECT main_ts FROM main_test WHERE main_id < m.main_id ORDER BY main_id DESC LIMIT 1), 0)
ORDER BY
s.sec_ts DESC
LIMIT 1
) AS sec_ts
FROM
main_test m
ORDER BY
m.main_id;
确保时间戳列和主键列上有适当的索引。 main_test(main_id, main_ts) 和 sec_test(sec_ts) 上的索引将是有益的。