1

我在SQLite中有以下数据库:

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

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

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

然后我有一个映射表(键映射)来存储如下所示的内部键值:

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

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

4

2 回答 2

2

您应该可以只使用 a 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

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

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
于 2013-06-26T22:33:37.160 回答
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 的三个连接查询一样快地执行这个查询。)

于 2013-06-27T07:05:32.700 回答