2017-03-16 62 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實現此查詢?
如果可能的話,我希望除了名稱+描述之外,還有一個查詢不會變得很龐大,只有20個屬性。


這裏是我當前的嘗試,它的鍵合併行,但不幸的是,我不知道如何告訴它喜歡英語,如果幾種語言可供現場:

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

回答

-1

的想法是左連接yor結果和英文行的結果只優先於英語 不幸的是,sqlite3有聚合函數的bug,在外層執行所有聚合函數,我不能使用MIN或MAX,我只是使用field而不是,絕對不是保證這個bug在未來版本中不會消失

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()的想法是不壞,但你要修改的值,以確保它們是訂購正確,然後恢復:

SELECT key, 
     substr(max(name),  2) AS name, 
     substr(max(description), 2) AS description 
FROM (SELECT key, 
      (language = 'English') || name  AS name, 
      (language = 'English') || description AS description 
     FROM monuments) 
GROUP BY key;