具有不同主键值的 SQLite 连接表

Posted

技术标签:

【中文标题】具有不同主键值的 SQLite 连接表【英文标题】:SQLite Join Tables With Different Primary Key Values 【发布时间】:2022-01-13 18:30:25 【问题描述】:

我在 SQLITE 中有两个表,一个表 FastData 以高速率记录数据,而另一表 SlowData 以较低速率记录数据。 FastDataSlowData 共享一个表示数据捕获时间的主键 (PK)。因此,这两个表可能如下所示:

Fast Data         Slow Data
Pk   Value1       Pk   Value2
2    1            1    1
3    2            4    2
5    3            7    3
6    4
7    5
9    6

我想创建一个 Select 语句,将这两个填写 SlowData 的表与之前捕获的数据连接起来。

Join Data         
Pk   Value1  Value2
2    1       1
3    2       1
5    3       2
6    4       2
7    5       3
9    6       3

【问题讨论】:

我目前最好的就是使用左连接Select FastData.PK, FastData.Value1, Slowdata.Value2From FastDataLeft Join SlowData ON FastData.PK = SlowData.PKOrder By FastData.PK 【参考方案1】:

您可以尝试以下方法,该方法使用row_number 确定与Pk 相关的最新条目,作为执行左连接后Value2 的理想条目。

SELECT 
    Pk,
    Value1,
    Value2
FROM (
    SELECT
        f.Pk,
        f.Value1,
        s.Value2,
        ROW_NUMBER() OVER (
            PARTITION BY  f.Pk, f.Value1
            ORDER BY s.Pk DESC
        ) rn
    FROM
        fast_data f
    LEFT JOIN
        slow_data s ON f.Pk >= s.Pk
) t
WHERE rn=1;
Pk Value1 Value2
2 1 1
3 2 1
5 3 2
6 4 2
7 5 3
9 6 3

View working demo on DB Fiddle

【讨论】:

【参考方案2】:

您需要一个LEFT 表连接和FIRST_VALUE() 窗口函数来选择Value2

SELECT DISTINCT f.Pk, f.Value1,
       FIRST_VALUE(s.Value2) OVER (PARTITION BY f.Pk ORDER BY s.Pk DESC) Value2
FROM FastData f LEFT JOIN SlowData s
ON s.Pk <= f.Pk;

请参阅demo。

【讨论】:

以上是关于具有不同主键值的 SQLite 连接表的主要内容,如果未能解决你的问题,请参考以下文章

在 Iphone 中使用 Core Data 从 SQLite 数据库中获取主键值

sqlite:具有自动递增列的多列主键

SQLite:更新具有顺序值的多行列

如何使用来自两个不同表SQLite的元素更新/删除

SQLITE:选择共享相同外键的所有项目

Sqlite3 从列中具有相似值的行获取数据