2017-08-11 4 views
0

Ich habe zwei Tabellen Projekt und Code. Die Codetabelle hat eine Referenz der Projekttabelle mit einer Beziehung von einem Projekt zu einem anderen. Nun meine Forderung ist durch das Label von nur ersten Datensatz in Codes Tabelle für das ProjektWie erhalten Daten aus referenzierter Tabelle nur nach dem ersten übereinstimmenden Referenzierungswert aus der referenzierenden Tabelle?

Für zB alle Projektdaten, um zu bekommen, wenn mein Projekt Tabelle folgende Daten:

PROJECT_ID PROJECT_NAME PROJECT_TYPE 
1   a    test1 
2   b    test2 

und Codes Tabelle hat unter erwähnte Daten wo project_id ist Fremdschlüssel dann sollte ich zuerst Projekt-ID 2 und 1 später wie für Projekt-ID der erste Mapping-Wert enthält Label d und für Projekt-ID 2 ist es ein. Ich bin nicht in der Lage, eine Lösung dafür zu finden.

ID PROJECT_ID LABEL 
1  1   d 
2  1   b 
3  1   c 
4  2   a 

Wunsch Ausgang

PROJECT_ID PROJECT_NAME PROJECT_TYPE 
    2   b    test2 
    1   a    test1 
+0

„ein zu viele Beziehung ...“:) –

+0

@TabAlleman ja –

+0

können Sie eine Probe Ihres gewünschten Ausgangs teilen? – Phil

Antwort

0

Ihre Phrase "first matching" ist nicht eindeutig - es um die Bestellung von LABEL oder durch ID in Ihrem Codes siehe Tabelle könnte. Nehmen wir die erste Alternative an, die nach Label sortiert, dann sollte etwas wie das Folgende die Projektdaten in der gewünschten Reihenfolge erzeugen. entsprechend

select p.* 
from  project as p 
     inner join (
      select project_id, min(label) as lbl 
      from  code 
      group by project_id 
      ) as c on c.project_id=p.project_id 
order by c.lbl; 

Wenn Sie mit dem ID stattdessen bestellen müssen, ändern Sie einfach die Unterabfrage und die ORDER BY Klausel.

+0

Join sollte auf Projekt basieren würde ich aber Bestellung durch sollte auf dem Etikett sein. Aber Reihenfolge sollte nur auf dem ersten übereinstimmenden Datensatz in der Codetabelle sein. Lassen Sie es mich wissen, wenn es Probleme gibt, die Anforderung zu überprüfen. –

0

Da es keine Aggregatfunktion gibt, die dem ersten Vorkommen entspricht, müssen Sie zwei Joins erstellen: zuerst die Code-ID des ersten Vorkommens und dann eine weitere, um den Label-Wert für dieses Vorkommen zu erhalten :

SELECT p.* 
FROM PROJECT p 
JOIN (SELECT MIN(ID) AS ID, PROJECT_ID 
     FROM code 
     GROUP BY PROJECT_ID) AS findFirst 
     ON findFirst.PROJECT_ID = p.PROJECT_ID 
JOIN code c ON findFirst.ID = c.ID 
ORDER BY c.LABEL 
Verwandte Themen