我在作者和出版物之间有多对多的关系。我有一个单独的作者表,我想为该表中的每个条目插入共同作者。
到目前为止,我可以查询共同作者(包括作者本身)的固定行(这里是author_id = 1的行)[使用RosSQL帮助更新]:
SELECT DISTINCT a.name
FROM publication_authors pa
JOIN authors a
ON a.id = pa.author_id
WHERE pa.publication_id IN
(SELECT publication_id
FROM publication_authors
WHERE author_id=1)
;
我很难找到合适的语法来将子查询与外部查询结合起来。我基本上喜欢的是一种表达方式:
for id in authors:
QUERY(id) // where id is substituted for 1
此外,还可以在authors表中提供共同作者的年份,该表存储在单独的出版物表中。
我的表格包含以下列:
作者: id |名称
出版物: id |名字|年
作者/出版物: id | ID
作者应该成为: id |名字|合着者|年
如下所述,保存共同作者信息的新表格也可以。
答案 0 :(得分:0)
当你说," ...喜欢为每个条目插入共同作者。"您应该知道,在您的数据库中只有一个真实的守护者是最佳做法。在构建数据仓库时不是这种情况。
您的问题的一个问题是您有多个共同作者。这在多对多关系中是完全可能的。
如果您只想以您指定的格式生成输出,请尝试:
select
pub.id
, pub.name
, stuff((SELECT ', ' + a.name
from publication_authors pa
join Author a on a.id = pa.AuthorID
WHERE pa.PublicationID = pub.id
FOR XML PATH('')),1,1,' ') as Authors
, pub.year_
from publication pub
答案 1 :(得分:0)
如果您只想在多对多表格中显示前两个条目,第一个条目为“作者”,第二个条目为“coAuthor”,那么您可以尝试:
select *
, (select top 1 a.name
from Author a
join publication_authors pa on pa.AuthorID = a.id
join Publication pub_ on pub_.id = pa.PublicationID and pub_.id = PubID
where a.name <> z.Author
order by pa.id
) as CoAuthor
from (
select
pub.id as PubID
, pub.name
, (select top 1 a.name
from Author a
join publication_authors pa on pa.AuthorID = a.id
join Publication pub_ on pub_.id = pa.PublicationID and pub_.id = pub.id
order by pa.id
) as Author
, pub.year_
from publication pub
) z
这将在TSQL中运行,您必须在PostgreSQL中自己尝试。也许下次你可能用PostgreSQL标记。