在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*
说明:
如何使用SQLite SQL实现此查询?
如果可能的话,我希望除了名称+描述之外,还有20个属性不会变得很大的查询。
这是我目前的尝试,它按键合并行,但不幸的是,如果某个字段有多种语言,我不知道如何告诉它更喜欢英语:
SELECT
key,
MAX(name) AS name,
MAX(description) AS description
FROM
monuments
GROUP BY
key;
答案 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