2016-05-11 9 views
0

Ich habe eine Tabelle Authors in SQL Server mit Author_ID als Primärschlüssel.Umgang mit mehrwertigen Fremdschlüssel in SQL Server

Authors Tabellenstruktur

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

Ich habe eine andere Tabelle mit CoAuthorsCoAuthor_ID als Primärschlüssel und mit Author_ID als Fremdschlüssel.

CoAuthors Tabellenstruktur

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

Ich habe eine andere Autor-Koautor Zuordnungstabelle Yearly_Author_CoAuthors als:

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

Jetzt muss ich aus Authors Tisch zu bekommen Fremdschlüssel in CoAuthors Tabelle einfügen. Das Problem ist, ich mehrere Werte von Author_ID für CoAuthor_ID wie zum Beispiel die Ausführung dieser Abfrage haben:

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

Und ich habe diese Ausgabe:

Author_ID | CoAuthor_ID | Year 
------------------------------ 
677  | 901706  | 2005 
677  | 901706  | 2007 
677  | 901706  | 2009 
1683703 | 901706  | 2012 

, die zeigt, dass CoAuthor_ID = 901706 ist mit zwei DISTINCT Author_ID, so hier:

Wie kann ich Author_ID als Fremdschlüssel Einschränkung in CoAuthors Tabelle einfügen?

+0

Haben Sie Google einen Fremdschlüssel hinzufügen? Was genau ist das Problem, auf das Sie stoßen? – dfundako

+0

Wenn ich es richtig verstanden habe, haben Sie die Brückentabelle hinzugefügt, die Autor CoAuthor zuordnet, um zu speichern, an welchen Daten zwei Personen an einem Buch oder etwas zusammen gearbeitet haben? Wenn ja, benötigen Sie die Eins-zu-viele-Beziehung zwischen CoAuthor und Author? – MLT

+0

Sie können das nicht haben, weil Ihr Entwurf es nicht erlaubt. –

Antwort

0

bei Ihrem Beispiel Yearly_Author_CoAuthors Suche Auswahlabfrage Sie die doppelten Werte eingegeben haben müssen sie zurückkehren.

Geben Sie entweder Author_ID & CoAuthor_ID den zusammengesetzten Primärschlüssel (ohne Jahr) ein, oder fügen Sie einen eindeutigen Index über diese beiden Spalten hinzu.

EDIT: Wenn Sie keine Fremdschlüssel auf Yearly_Author_CoAuthors.Author_ID und Yearly_Author_CoAuthors.CoAuthor_ID verfügen, dann würde ich raten, zunächst, dass Sie das Skript in user3481891 Antwort zwicken sie zu dieser Tabelle hinzuzufügen. Dann sehe ich nicht, warum Sie nicht abfragen könnten, was Sie bereits haben. Hier sind einige Beispiele (ungetestet, ich fürchte, lass es mich wissen, wenn sie nicht funktionieren):

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

natürlich vorausgesetzt, dass Sie die Yearly_Author_CoAuthors Tabelle haben, um eine Verbindung zwischen Autoren und dem Jahr zu zeigen, in dem es zuerst auftrat. Wenn Sie eine Liste von Jahren für die Autorenpartnerschaften erwarten, dann ist nichts an der Ausgabe Ihrer Beispielabfrage falsch, da sie alle verschiedene Jahre sind. – MLT

+0

@ MLT - können Sie ein Beispiel hinzufügen, wie Author_ID und CoAuthor_ID den zusammengesetzten Primärschlüssel bilden Verwenden wir dann die Yearly_Author_CoAuthors-Tabelle? – maliks

+0

Sicher, aber zuerst sollten Sie erklären, was Sie von Ihrer Yearly_Author_CoAuthors Tabellenabfrage erhalten möchten, Sie müssen nur die Abfrage ändern – MLT

0

Die mögliche Viele-zu-viele-Beziehung zwischen Autoren und Co-Autoren verhindert die Fremdschlüsseleinschränkung nicht, solange die Author_ID innerhalb der Authors-Tabelle eindeutig ist. Einfach dies zu tun:

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

Natürlich, wenn die Author_ID innerhalb der Authors-Tabelle nicht eindeutig ist, wird dies nicht funktionieren. Ein Fremdschlüssel erfordert, dass die Referenz eindeutig ist. Dies ermöglicht Ihnen, Dinge wie ON DELETE CASCADE usw. zu tun. – quest4truth

+0

Author_ID ist eindeutig in Authors-Tabelle und CoAuthor_ID ist einzigartig in CoAuthors-Tabelle – maliks

+0

Dann glaube ich, dass dieser Code funktioniert und fügen Sie die Fremdschlüssel-Einschränkung Sie benötigen. – quest4truth