如何在SQLite的特定条件下进行SQL查询,将一个表的结果行与另一个表的结果行组合在一起
我有一个包含三个表的aSQLite3数据库。示例数据如下所示: 原创如何在SQLite的特定条件下进行SQL查询,将一个表的结果行与另一个表的结果行组合在一起,sql,database,sqlite,Sql,Database,Sqlite,我有一个包含三个表的aSQLite3数据库。示例数据如下所示: 原创 id aName code ------------------ 1 dog DG 2 cat CT 3 bat BT 4 badger BDGR ... ... ... 翻译后的 id orgID isTranslated langID aName -----------------------------
id aName code
------------------
1 dog DG
2 cat CT
3 bat BT
4 badger BDGR
... ... ...
翻译后的
id orgID isTranslated langID aName
----------------------------------------------
1 2 1 3 katze
2 1 1 3 hund
3 3 0 3 (NULL)
4 4 1 3 dachs
... ... ... ... ...
Lang
id Langcode
-----------
1 FR
2 CZ
3 DE
4 RU
... ...
我想从原始和翻译中选择所有数据,这样结果将包括原始表中的所有数据,但得到翻译的行的aName将替换为翻译表中的aName,因此,我可以应用ORDERBY子句,并以所需的方式对数据进行排序
所有的数据和表格设计都只是为了说明问题。该模式确实包含一些元素,如未翻译的列或翻译以及单独表中的原始名称。这些元素是应用程序目标/设计所必需的
更具体地说,这是我想要生成的一个示例行集。如果可以从原始对某个id进行翻译,则所有来自表原始的数据都会被翻译的中的数据修改
期望的结果
id aName code isTranslated
---------------------------------
1 hund DG 1
2 katze CT 1
3 bat BT 0
4 dachs BDGR 1
... ... ... ...
你可能应该列出你想要的实际结果,这将有助于人们在未来帮助你 在目前的情况下,我猜您希望遵循以下思路:
SELECT Original.id, Original.code, Translated.aName
FROM Original
JOIN Lang
ON Lang.langCode = 'DE'
JOIN Translated
ON Translated.orgId = Original.id
AND Translated.langId = Lang.id
AND Translated.aName IS NOT NULL;
(查看my,看看这些是否是您想要的结果)
在任何情况下,您所拥有的表格集都朝着一个相当标准的“翻译表格”设置前进。然而,我会做一些基本的改变
原件
- 将表格命名为特定的名称,如
Animal
- 不要在表中包含“默认”翻译(如有必要,可以使用视图)
- “代码”很好,但对于动物来说,可能应该使用属/种
Lang
- “Lanugage”在RDBMS中通常是一个保留字,因此名称很好
- 明确指定您正在使用的“语言代码”(不要缩写列名)。实际上(最多)可能有三种不同的ISO代码-只需将它们全部获取即可
- (另外,请记住,语言有特定于语言的名称,因此语言还需要自己的“翻译”表)
Translated
- 将表实体命名为特定的,如
,或类似的名称AnimalNameTranslated
是不必要的-您可以从行的存在中派生它-如果术语尚未翻译,请不要添加行isTranslated
- 将所有的“翻译”放入表中,包括“默认”翻译。这意味着你所有的条件都在一个地方,所以你不必去其他地方寻找
这是一个典型的应用程序: 如果并非所有原始中的记录在翻译后的中都有相应的记录,请改用左连接
如果未翻译的名称被保证为
NULL
,您可以改用。感谢所有提示,虽然我忘了提到这些数据和表只是示例,但事实上我使用的数据库更复杂。我还想输入原始行,如果没有翻译,我的设计中需要“isTranslated”标志,设计中也需要原始表看起来很棒,现在我无法测试它,但我会尽快完成,干杯!
SELECT Original.id,
CASE isTranslated
WHEN 1 THEN Translated.aName
ELSE Original.aName
END AS aName,
code,
isTranslated
FROM Original
JOIN Translated ON Original.id = Translated.orgID
WHERE Translated.langID = (SELECT id FROM Lang WHERE Langcode = 'DE')