2014-05-15 4 views
0

저자와 발행물 사이에 다 대다 관계가 있습니다. 별도의 작성자 테이블이 있으며 모든 항목에 대해 공동 작성자를 해당 테이블에 삽입하고 싶습니다. 지금까지중첩 된 쿼리 및 삽입

, 나는 [RosSQL의 도움으로 업데이트] (= 1 author_id 여기 행) 고정 행 (저자 자체 포함) 공동 저자를 조회 할 수 있습니다

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

"... 모든 항목에 대해 공동 작성자를 해당 테이블에 삽입하고 싶습니다."라고 말하면 데이터베이스에이라는 단 하나의 골키퍼 만 보유하는 것이 우수 사례 인 임을 알아야합니다. 데이터웨어 하우스를 구축 할 때는 그렇지 않습니다.

귀하의 질문에 대한 문제는 둘 이상의 공동 작성자가있는 경우입니다. 이는 다 대다 관계에서 전적으로 가능합니다. 당신은 당신이 지정한 형식으로 출력을 생성하려면

, 다음 시도 :

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 
+0

답변 해 주셔서 감사합니다.하지만 초보자로서 불행히도 내 머리 위로갔습니다. 먼저 PostgreSQL을 사용하도록 지정 했으므로 'stuff'를 사용할 수 없습니다. 대신 string_agg를 사용할 수 있는지 확실하지 않습니다. 공동 저자 정보를 별도의 테이블에 넣는 것도 좋을 것입니다. 어쩌면 나는 그것을 놓치고 있지만 공동 제작자를 만들기 위해 리디렉션 수준이 누락 된 것처럼 느껴질 수 있습니까? –

0

를 첫 번째로 대다 테이블의 첫 번째 두 항목을 표시하려면 "저자"다음은 시도 할 수 있습니다 "공동 저자"로 두 번째로 : 이것은 TSQL에서 작동

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 

, 당신은 PostgreSQL을에 스스로를 시도해야합니다. 아마도 다음에 PostgreSQL에 태그를 지정할 것입니다.