2017-03-16 8 views
1

)SQLiteデータベースでは、キーで識別されるモニュメントがあります。各キーについて、私はその記念碑について様々な言語(言語ごとの行)で名前+説明を持っています。名前と説明の一部が欠けている:鍵に基づくレコードのマージ(優先度は

key | language | name   | description 
====================================================== 
3 | English | *NULL*  | A museum in Paris 
3 | French | Le Louvre | Un musée à Paris 
7 | English | Manneken  | *NULL* 
7 | French | Manneken Pis | Une statue à Bruxelles 
9 | Spanish | Casa Batllo | *NULL* 

私の目標:私は同じキーを持つ行をマージしたい、英語を優先して。期待される結果:

key | name   | description 
=========================================== 
3 | Le Louvre | A museum in Paris 
7 | Manneken  | Une statue à Bruxelles 
9 | Casa Batllo | *NULL* 

説明:

  • 記念碑3:英語での説明、英語の名前がないので、他の言語から名前。
  • 記念碑7:英語から、英語は説明がないので、別の言語の説明。
  • 記念碑9:英語は全く情報がないため、スペイン語のすべてです。

SQLite SQLでこのクエリを実装する方法は?
可能であれば、私はname + descriptionに加えて20のプロパティで膨大にならないクエリを期待しています。ここで


が私の現在の試みである、それはキーで行をマージしますが、残念ながら私はいくつかの言語は、フィールドで使用可能な場合は、英語を好むことを言うのか分からない:

SELECT 
    key, 
    MAX(name) AS name, 
    MAX(description) AS description 
FROM 
    monuments 
GROUP BY 
    key; 

答えて

-1

アイデアは、結果を左に結合し、英語の行の結果のみを英語に優先させることです 残念ながら、sqlite3は集約関数のバグがあり、すべての集約関数を外側のレベルで実行しますが、MINまたはMAXは使用できません。このバグは将来のバージョンでは消滅しません。

select a.key,coalesce(b.name,a.name) name, coalesce(b.description,a.description) description from 
(SELECT 
    key, 
    name, 
    description 
FROM 
    muzeums 
group by key ) a 
left join 
(SELECT 
    key, 
    name, 
    description 
FROM 
    muzeums where language='English') b 
on a.key=b.key 
1

それぞれの値をルックアップするためにサブクエリを使用することも可能である:

SELECT key, 
     (SELECT name 
     FROM monuments 
     WHERE key = k.key 
     ORDER BY language != 'English' 
     LIMIT 1 
     ) AS name, 
     (SELECT description 
     FROM monuments 
     WHERE key = k.key 
     ORDER BY language != 'English' 
     LIMIT 1 
     ) AS description 
FROM (SELECT DISTINCT key 
     FROM monuments) AS k; 

はまた、MAX()アイデアは悪くないですが、あなたは彼らがしていることを確認するために、値を変更する必要はあり正しく注文してから復元してください。

関連する問題