嵌套查询和插入

时间:2014-05-15 17:30:39

标签: sql postgresql

我在作者和出版物之间有多对多的关系。我有一个单独的作者表,我想为该表中的每个条目插入共同作者。

到目前为止,我可以查询共同作者(包括作者本身)的固定行(这里是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 |名字|合着者|年

如下所述,保存共同作者信息的新表格也可以。

2 个答案:

答案 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标记。