SQLite - 使用多个映射表来解析值

时间:2013-06-26 22:26:59

标签: sql join sqlite mapping

我在 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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

你应该只能使用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

答案 1 :(得分:1)

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

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的查询一样快。)