如何进行SQL查询,将SQLite中特定条件下的一个表的结果行与另一个表的行组合在一起

时间:2012-09-27 00:44:33

标签: sql database sqlite

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

2 个答案:

答案 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以查看这些是否是您想要的结果。


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

  1. Original

    • 将表格命名为特定内容,例如Animal
    • 请勿在表格中添加“默认”翻译(如有必要,您可以使用视图)。
    • 'code'很好,虽然在动物的情况下,可能应该使用属/种类
  2. Lang

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

    • 将表定义为特定于实体,如AnimalNameTranslated或某些。
    • isTranslated是不必要的 - 您可以从的存在中派生出来 - 如果该术语尚未翻译,请不要添加行。
    • 所有'翻译'放入表格,包括“默认”翻译。这意味着您的所有条款都在一个地方,因此您不必去其他地方寻找。