我有一个包含三个表的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
... ...
我想从原始和翻译中选择所有数据,结果将包含原始表中的所有数据,但是aName 将替换为 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
... ... ... ...
最佳答案
这是 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)
相反。
关于sql - 如何在 SQLite 中的特定条件下进行 SQL 查询,将一个表的结果行与另一表的行组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12612482/