1

我有一个 sqlite 数据库,它有一个文档表(期刊文章),其中每个文档都有一个唯一的 ID。所有作者都列在另一个表中,带有相应的文档 ID,以及唯一的作者 ID。问题是文章有不同数量的作者。如果有一位作者,我应该只检索他的名字。如果有两个,我应该检索两个名称。如果有两个以上,我只需要检索第一作者并附加“et al”。给它。

在以下示例中,我需要生成“作者 - 标题”类型的记录。对于文档 Title1,我应该有“Name101 et al. - Title1”,对于 Title2 - “Name201 - Title2”,对于 Title3 - “Name301 & Name302 - Title3”。

DocsTable
Title   |  DocId
Title1  |  10
Title2  |  20
Title3  |  30

AuthorsTable
Name      | AuthorId  | DocId
Name101   |    101    | 10
Name102   |    102    | 10
Name103   |    103    | 10
Name201   |    201    | 20
Name301   |    301    | 30
Name302   |    302    | 30

我当然可以通过至少两个查询来做到这一点,但我怎么能在一个语句中做到这一点呢?

另一个相关的问题是我想按作者姓名以不区分重音的顺序对结果进行排序(例如,ú = ü = u)。我知道 COLLATE Latin1_General_CI_AI,它在 LIKE 子句中工作正常,但是当我写 ORDER BY names COLLATE Latin1_General_CI_AI 时,语句返回错误。

4

1 回答 1

1

SQL 表上没有“第一”作者之类的东西。SQL 表表示无序集。您可以在 SQLite 中获得的最接近的方法是使用rowid.

select docId,
       (case when count(*) = 1 then min(name)
             when count(*) = 2
             then max(case when rowid = minrowid then name end) || ' & ' ||
                  max(case when rowid <> minrowid then name end)
             else max(case when rowid = minrowid then name end) || ', et al'
         end) as authors
from AuthorsTable a left join
     (select a2.docid, min(rowid) as minrowid
      from AuthorsTable a2
      group by a2.docid
     ) aa
     on a.docid = a2.docid
group by docid;

编辑:

根据订购是按授权的评论:

select docId,
       (case when count(*) = 1 then min(name)
             when count(*) = 2
             then max(case when AuthorId = minAuthorId then name end) || ' & ' ||
                  max(case when AuthorId <> minAuthorId then name end)
             else max(case when AuthorId = minAuthorId then name end) || ', et al'
         end) as authors
from AuthorsTable a left join
     (select a2.docid, min(AuthorId) as minAuthorId
      from AuthorsTable a2
      group by a2.docid
     ) aa
     on a.AuthorId = a2.minAuthorId
group by docid;
于 2015-12-28T18:45:26.593 回答