2017-03-16 82 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;