2016-05-11 11 views
0

をプライマリキーとして持つテーブルAuthorsがSQL Serverにあります。SQL Serverで複数値の外部キーを処理する方法

Authorsテーブル構造

Author_ID | Author_Name 
---------------------------- 
677  | Nuno Vasconcelos 
1359  | Peng Shi 
6242  | Z. Q. Shi 
...  | ... 
...  | ... 

私は主キーとしておよび外部キーとしてAuthor_IDCoAuthor_IDで別のテーブルCoAuthorsを持っています。

CoAuthorsテーブル構造

CoAuthor_ID | CoAuthor_Name | Author_ID 
--------------------------------------- 
47   | Jim Bezdek | NULL 
111   | Vishal Gupta | NULL 
318   | Muaz A. Niazi | NULL 
...   | ...   | ... 
...   | ...   | ...  

私はと別の著者・共著者マッピングテーブルYearly_Author_CoAuthorsを持っています。今、私はAuthorsテーブルから取得CoAuthorsテーブルに外部キーを挿入する必要が

Author_ID | CoAuthor_ID | Year 
------------------------------ 
677  | 901706  | 2005 
677  | 838459  | 2007 
677  | 901706  | 2007 
...  | ...   | ... 
...  | ...   | ... 

SELECT 
    Author_ID, CoAuthor_ID, Year 
FROM  
    Yearly_Author_CoAuthors 
WHERE 
    CoAuthor = 901706 
ORDER BY 
    Author_ID, Year, CoAuthor_ID 

そして、私はこの出力を得た:

CoAuthor_ID = 901706はそう、2 DISTINCT Author_IDを持っていることを示している
Author_ID | CoAuthor_ID | Year 
------------------------------ 
677  | 901706  | 2005 
677  | 901706  | 2007 
677  | 901706  | 2009 
1683703 | 901706  | 2012 

問題は、私はこのクエリを実行するインスタンスのようCoAuthor_IDためAuthor_IDの複数の値を持つことができていますここに:

CoAuthorsテーブルに外部キー制約としてAuthor_IDを挿入するにはどうすればよいですか?

+0

グーグルで外部キーを追加しましたか?具体的には、実行している問題は何ですか? – dfundako

+0

私が正しく理解していれば、2人の人物が一緒に仕事をしていた本を何かに保存するために、著者をCoAuthorにマップするブリッジテーブルを追加しましたか?もしそうなら、あなたはCoAuthorと著者の間に1対多の関係が必要ですか? – MLT

+0

あなたのデザインはそれを許可していないので、それを持つことはできません。 –

答えて

0

:単純にこれを行います。

Author_ID & CoAuthor_ID複合主キー(年なし)を作成するか、これらの2つの列に一意のインデックスを追加します。

EDIT:あなたはYearly_Author_CoAuthors.Author_IDとYearly_Author_CoAuthors.CoAuthor_IDに外部キーを持っていない場合は 、その後、私はあなたがそのテーブルに追加するuser3481891の答えでスクリプトを微調整することを第一に助言します。 それで、あなたが既に持っているものを照会できない理由がわかりません。ここにいくつかの例があります(私は恐れていますが、動作しない場合は教えてください):

-- to get list of who a CoAuthor has worked with and when 
select a.Author_Name, 
     ca.CoAuthor_Name, 
     [Year] 
from Authors a inner join 
     Yearly_Author_CoAuthors yac on a.Author_ID = yac.Author_ID inner join 
     CoAuthors ca on yac.CoAuthor_ID = ca.CoAuthor_ID 
where yac.CoAuthor = 901706 

-- to get a list of first occasions when a CoAuthor has worked with each Author 
select a.Author_Name, 
     ca.CoAuthor_Name, 
     min([Year]) as FirstCollaborationDate 
from Authors a inner join 
     Yearly_Author_CoAuthors yac on a.Author_ID = yac.Author_ID inner join 
     CoAuthors ca on yac.CoAuthor_ID = ca.CoAuthor_ID 
where yac.CoAuthor = 901706 
group by a.Author_Name, 
     ca.CoAuthor_Name 
order by min([Year]) 
+0

はもちろん、作成者と最初に発生した年の間のリンクを示すYearly_Author_CoAuthorsテーブルがあることを前提としています。著者のパートナーシップの年のリストを期待している場合、サンプルのクエリの出力には何も問題はありません。 – MLT

+0

@ MLT - Author_IDとCoAuthor_IDを複合主キーにする方法の例を追加できますかYearly_Author_CoAuthorsテーブルを使用しますか? – maliks

+0

もちろん、Yearly_Author_CoAuthorsテーブルクエリから戻ってくるものを説明する必要があります。クエリを変更する必要があるかもしれません。 – MLT

0

Authorsテーブル内でAuthor_IDが一意である限り、著者と共同編集者の多対多関係によって、外部キー制約が妨げられることはありません。あなたがそれらを返すことが重複する値を入力しておく必要がありますあなたの例のYearly_Author_CoAuthors選択クエリを見てみると

ALTER TABLE CoAuthors 
ADD CONSTRAINT FK_Authors_Author_ID FOREIGN KEY (CoAuthor_ID) 
    REFERENCES Authors (Author_ID) 
+0

Author_IDがAuthorsテーブル内で一意でない場合、これは機能しません。外部キーでは、参照が一意であることが必要です。これにより、ON DELETE CASCADEなどの処理を行うことができます。 – quest4truth

+0

Author_IDはAuthorsテーブルで一意であり、CoAuthor_IDはCoAuthorsテーブルで一意です。 – maliks

+0

このコードは動作し、必要な外部キー制約を追加すると考えられます。 – quest4truth

関連する問題