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


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

最佳答案

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



SQL Fiddle Demo




另一种选择是将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



More Fiddle

10-06 06:53