【问题标题】:SQLite - Using multiple mapping tables to resolve valuesSQLite - 使用多个映射表来解析值
【发布时间】:2013-06-24 06:27:32
【问题描述】:

我在 SQLite 中有以下数据库:

我有一个表(称为击键),其中包含英文的击键组合(必须是人类可读的)。它具有以下(示例)结构:

---------------------
base | special1 | special2
---------------------
V      CTRL       ALT
F2     NONE       NONE
F4     ALT        NONE

基本字段是常规键盘键,而 special1 和 special2 字段是“特殊”键盘键(Alt、Control、Shift、Windows 或无)

然后我有一个映射表(keymapping)来存储看起来像这样的内部键值:

---------------------
key | keyvalue
---------------------
V     86
F2    133
F4    115

最后我有另一个表(keymappingspecial)存储特殊键的内部值,如下所示:

---------------------
key | keyvalue
---------------------
CTRL  1
ALT   2
NONE  0

我为“常规”和“特殊”键创建了单独的表,因为用于定义数值的逻辑不同。

我想要的是能够查询两个表,以便我将第一个表(击键)转换为表 keymapping 和 keymappingspecial 中定义的纯数值。 因此,第一个示例表将转换如下:

---------------------
base | special1 | special2
---------------------
86     1          2
113    0          0
115    2          0

到目前为止,我一直无法创建正确的查询。

【问题讨论】:

    标签: sql join sqlite mapping


    【解决方案1】:

    您应该可以只使用JOIN,加入keymappingspecial 表两次:

    SELECT km.KeyValue Base,
        kms.KeyValue Special1,
        kms2.KeyValue Special2
    FROM keystrokes k
        INNER JOIN keymapping km ON k.base = km.key
        INNER JOIN keymappingspecial kms ON k.special1 = kms.key
        INNER JOIN keymappingspecial kms2 ON k.special2 = kms2.key
    

    另一种选择是使用MAXCASE 来删除其中一个联接:

    SELECT km.KeyValue Base,
        MAX(CASE WHEN kms.key = K.special1 THEN kms.KeyValue END) Special1,
        MAX(CASE WHEN kms.key = K.special2 THEN kms.KeyValue END) Special2
    FROM keystrokes k
        INNER JOIN keymapping km ON k.base = km.key
        INNER JOIN keymappingspecial kms ON kms.key IN (k.special1,k.special2)
    GROUP BY km.KeyValue
    

    【讨论】:

    • 谢谢,两个答案都完美!我想我在尝试使用 LEFT JOIN 时犯了错误。另外,感谢使用 SQL Fiddle!
    【解决方案2】:

    或者,您可以使用子查询来查找相应的值:

    SELECT (SELECT keyvalue
            FROM keymapping
            WHERE key = keystrokes.base) AS base,
           (SELECT keyvalue
            FROM keymappingspecial
            WHERE key = keystrokes.special1) AS special1,
           (SELECT keyvalue
            FROM keymappingspecial
            WHERE key = keystrokes.special2) AS special2
    FROM keystrokes
    

    但是,并非所有数据库都可以优化子查询和连接。
    (SQLite 执行这个查询的速度与 sgeddes 的三个连接查询一样快。)

    【讨论】:

    • 谢谢,这也很有效,尽管在我看来它比使用 INNER JOIN 稍微“清晰”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2017-07-02
    相关资源
    最近更新 更多