我在 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
到目前为止,我一直无法创建正确的查询。
答案 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
另一个选择是使用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
答案 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的查询一样快。)