根据链接表中的值,使用每行选择的连接表加入SQLite

时间:2013-10-08 22:29:51

标签: sql sqlite relational-database

我有如下表格:

肌肉

id          primary_synonym_id  source
----------  ------------------  ----------
1           1                   1
2           2                   2
3           3                   3

muscle_synonyms

id          synonym        
----------  ---------------
1           Gluteus maximus
2           Soleus
3           Infraspinatus

来源 (正如您所知,sources旨在作为链接表。)

id          type        sub_id
----------  ----------  ----------
1           url         1
2           url         2
3           book        1

source_urls

id          url
----------  ------------------
1           http://v.gd/3NCOMC
2           http://v.gd/fWdonY

source_books

id          isbn
----------  ----------
1           1405006692

从上面,您建议使用哪个查询来生成以下输出?

id          synonym          ref
----------  ---------------  ------------------
1           Gluteus maximus  http://v.gd/3NCOMC
2           Soleus           http://v.gd/fWdonY         
3           Infraspinatus    1405006692

请提及有价值的替代方案 - 如果有的话 - 对于这样的查询,您认为会促进良好的数据库实践。 (例如,构造数据和使用更简单查询的不同方法。)

3 个答案:

答案 0 :(得分:2)

我不熟悉coalesce()功能。以下查询的灵感来自this,并且有效:

select muscles.id, synonym, coalesce(url, isbn) as ref
from muscles
join muscle_synonyms on muscles.primary_synonym_id = muscle_synonyms.id
join sources on muscles.source = sources.id
left join source_urls on
    sources.type = 'url' and
    sources.sub_id = source_urls.id
left join source_books on
    sources.type = 'book' and
    sources.sub_id = source_books.id
where ref not null;

答案 1 :(得分:0)

我不完全理解来源中的sub_id以及它与source_books的关联方式

sql几乎就像这样

select m.id,ms.synonym,su.url from muscles m
join muscle_synonym ms on ms.id=m.primary_synonym_id
join sources s on s.id=m.source
join source_url su on s.sub_id=su.id

答案 2 :(得分:0)

对于source_*有两个不同的表,我看不出任何优势。

我会将source_urlsource_book合并到source_ref中,所以:

id          type        ref
----------  ----------  ------------------
1           url         http://v.gd/3NCOMC
2           url         http://v.gd/fWdonY
3           book        1405006692

sources将成为两个表加入:

id          ref_id
----------  ----------
1           1
2           2
3           3

所以你的查询将成为简单的连接:

SELECT muscles.id, muscle_synonyms.synonym, source_ref.ref FROM muscles
LEFT JOIN muscle_synonyms ON muscles.id=muscle_synonyms.id
LEFT JOIN source ON muscles.source=source.id
LEFT JOIN source_ref ON source.ref_id=source_ref.id;

这将包括所有肌肉,包括那些没有synonym来源的肌肉,也没有任何参考资料。