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

如何在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 -----------------------------

我有一个包含三个表的aSQLite3数据库。示例数据如下所示:

原创

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')