我在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
另一种选择是将
MAX
与CASE
一起使用以删除其中一个联接: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