合并基于密钥的记录,优先级

时间:2017-03-16 09:01:16

标签: sql sqlite

在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;

2 个答案:

答案 0 :(得分:1)

可以使用子查询来查找每个值:

<!DOCTYPE html>
<html>
  <head>
    <title>Mocha Tests</title>
    <link rel="stylesheet" href="node_modules/mocha/mocha.css">
  </head>
  <body>
    <div id="mocha"></div>
    <script src="node_modules/mocha/mocha.js"></script>
    <script src="node_modules/chai/chai.js"></script>
    <script>mocha.setup('bdd')</script>

    <!-- load code you want to test here -->

    <!-- load your test files here -->

    <script>
      mocha.run();
    </script>
  </body>
</html>

或者,MAX()的想法也不错,但您必须修改这些值以确保它们正确排序,然后再恢复它们:

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;

答案 1 :(得分:-1)

这个想法是将英语行的结果和结果保留为英语行优先级 不幸的是,sqlite3有聚合函数的bug,执行外层的所有聚合函数,我不能使用MIN或MAX,我只使用字段,绝对不保证这个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