我有一个包含三个表的SQLite3数据库。示例数据如下所示:
原始
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
... ... ... ... ...
郎
id Langcode
-----------
1 FR
2 CZ
3 DE
4 RU
... ...
我想从原始和翻译中选择所有数据,其结果将包含原始表中的所有数据,但将替换为 Translated 表中的 aName ,因此我可以应用ORDER BY子句并以所需的方式对数据进行排序
所有数据和表格设计都只是为了说明问题。模式确实包含一些元素,如 isTranslated 列或单独表中的翻译和原始名称。应用程序目标/设计需要这些元素。
更具体地说,这是我想要生成的示例行集。如果来自原始的某些 id 的翻译可用来自已翻译的数据,则表格原始中的所有数据都是原始
期望的结果
id aName code isTranslated
---------------------------------
1 hund DG 1
2 katze CT 1
3 bat BT 0
4 dachs BDGR 1
... ... ... ...
答案 0 :(得分:2)
这是CASE expression的典型应用程序:
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')
如果Original
中的所有记录都没有Translated
中的相应记录,请改用LEFT JOIN
。
如果保证未翻译的名称为NULL
,则可以改为使用IFNULL(Translated.aName, Original.aName)
。
答案 1 :(得分:0)
你应该列出你想要的实际结果,这将有助于人们在将来帮助你。
在目前的情况下,我猜你想要这些内容:
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;
(查看我的example以查看这些是否是您想要的结果。
无论如何,你所拥有的表格集正朝着一个相当标准的“翻译表”设置前进。但是,我做了一些基本的改变。
Original
Animal
Lang
Translated
AnimalNameTranslated
或某些。isTranslated
是不必要的 - 您可以从行的存在中派生出来 - 如果该术语尚未翻译,请不要添加行。