2

3つのテーブルを持つ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     
...   ...         ...       ...     ...        

ラング

id Langcode
-----------
1    FR  
2    CZ
3    DE
4    RU
...  ...

結果がOriginalテーブルのすべてのデータで構成されるように、OriginalTranslatedからすべてのデータを選択したい のですが、変換された行のaNameTranslatedテーブルのaNameに置き換えられるため、ORDERBY句を適用して並べ替えることができます。希望する方法でデータ。

すべてのデータとテーブルのデザインは、問題を示すための例です。スキーマには、isTranslated列や変換などの要素と、元の名前が別々のテーブルに含まれています。これらの要素は、アプリケーションの宛先/設計で必要です。

具体的には、これは私が作成したい行セットの例です。これは、Originalの特定のIDに対して変換が利用可能な場合、 Translatedのデータによって変更されたOriginalのテーブルのすべてのデータです。

望ましい結果

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で予約語であることが多いため、名前は問題ありません。
    • 使用している「言語コード」に具体的に名前を付けます(列名は省略しないでください)。実際には(最大)3つの異なるISOコードが可能です-それらすべてを取得するだけです。
    • (また、言語には言語固有の名前があるため、言語には独自の「翻訳」テーブルも必要です)
  3. Translated

    • テーブルにエンティティ固有の名前をAnimalNameTranslated付けます。
    • isTranslated不要です-行の存在から導き出すことができます-用語がまだ翻訳されていない場合は、行を追加しないでください。
    • 'デフォルト'のものを含むすべての'翻訳'をテーブルに入れます。これは、すべての用語が1つの場所にあることを意味するため、他の場所を探す必要はありません。
于 2012-09-27T01:47:46.790 に答える