2

我有一个包含三个表的 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
...  ...

我想从 OriginalTranslated中选择所有数据,结果将包含Original表中的所有数据,但是得到翻译的行的aName将被 Translated 表中的 aName 替换,所以可以应用 ORDER BY 子句并排序以所需的方式获取数据。

所有数据和表格设计都是示例,只是为了说明问题。架构确实包含一些元素,例如isTranslated列或单独表中的翻译和原始名称。这些元素是应用程序目标/设计所必需的。

更具体地说,这是我想要生成的示例行集。如果翻译可用于 Original 中的某个id 则表Original中的所有数据都由Translated中的数据修改。

期望的结果

id    aName  code    isTranslated
---------------------------------  
1     hund     DG         1
2     katze    CT         1
3     bat      BT         0
4     dachs    BDGR       1
...   ...      ...        ...
4

2 回答 2

2

这是CASE 表达式的典型应用:

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)改用。

于 2012-09-27T07:05:09.383 回答
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;

(查看我的示例,看看这些是否是您想要的结果)。


无论如何,您所拥有的表格集正朝着相当标准的“翻译表格”设置迈进。但是,我会做一些基本的改变。

  1. Original

    • 将表格命名为特定的名称,例如Animal
    • 不要在表格中包含“默认”翻译(如有必要,您可以使用视图)。
    • “代码”很好,尽管在动物的情况下,可能应该使用属/种
  2. Lang

    • 'Lanugage' 通常是 RDBMS 中的保留字,所以这个名字很好。
    • 具体命名您正在使用的“语言代码”(并且不要缩写列名)。实际上(最多)可能有三种不同的 ISO 代码 - 只需将它们全部抓取即可。
    • (另外,请记住语言具有特定于语言的名称,因此语言也需要它自己的“翻译”表)
  3. Translated

    • 将表实体命名为特定的,likeAnimalNameTranslated或类似的名称。
    • isTranslated是不必要的 - 您可以从的存在中推导出它- 如果该术语尚未翻译,请不要添加行。
    • 所有“翻译”放入表中,包括“默认”翻译。这意味着您的所有条款都在一个地方,因此您不必去其他地方寻找。
于 2012-09-27T01:47:46.790 回答