2017-09-11 3 views
0

Ich habe ein Beispiel für eine Datenbank mit drei Tabellen.SQL-Auswahl mit mehreren Joins

1 Work: workID, stateID, createddate 

2 Work history table: workID, old_state, new_state, transitiondate 

3 Work state: StateID; Statename 

Sagen wir mögliche Zustände sind 1 = ready, 2 = test und 3 = approved

ich Abfrage machen wollen, die Liste Werke und alle ihre Zustandsänderungen drucken. Die Ergebnisse sollten in etwa so aussehen:

ID, createddate, Currentstate, OldState, Newstate, transitiondate 
1, 1-1-2016, approved,  ready, test,  1-1-2016 
1, 1-1-2016, approved,  test,  approved, 2-1-2016 
2, 1-5-2016, test,   ready, test,  1-5-2016 
3, 1-10-2016, approved,  ready, test,  1-10-2016 
3, 1-10-2016, approved,  test,  approved, 1-15-2016 
... 

Ich weiß, wie Innen machen verbinden, so kann ich einfach den Namen des aktuellen Status der Arbeit von Staats Tisch bekommen, aber ich kann nicht die Namen der alten bekommen und neuer Staat. Welche Art von Join-Befehlen sollte ich verwenden?

+0

WorkState-Tabelle zweimal beitreten; einmal für alten Staat und einmal für neuen Staat. – jarlh

Antwort

0

Bitte unten Abfrage verwenden -

select t1.workID , t1.createddate , t3.Statename Currentstate , 
t4.Statename OldState , t5.Statename Newstate, t2.transitiondate 
from [Work] t1 
join [Work history] t2 on t1.workID = t2.workID 
join [state] t3 on t3.StateID = t1.stateID 
join [state] t4 on t4.StateID = t2.old_state 
join [state] t5 on t5.StateID = t2.new_state 
0

Gebrauch 3 innere wie unten an einem Tisch verbindet -

select 
w.workID as ID, 
W.createddate, 
WSC.Statename as Currentstate, 
WSO.Statename as OldState , 
WSN.Statename as Newstate, 
WH.transitiondate 
from Work W 
inner join workHistory WH on w.workID = WH.workID 
inner join WorkState WSC on WSC.StateId = W.StateId 
inner join WorkState WSO on WHO.StateId = WH.OldState 
inner join WorkState WSN on WSN.StateId = WH.Newstate 

ODER

select 
w.workID as ID, 
W.createddate, 
(select top 1 Statename from WorkState where stateId = W.StateId) as Currentstate, 
(select top 1 Statename from WorkState where stateId = WH.OldState) as OldState , 
(select top 1 Statename from WorkState where stateId = WH.Newstate) as Newstate, 
WH.transitiondate 
from Work W 
inner join workHistory WH on w.workID = WH.workID 
0

Hallo Valtteri Vaahtonen,

Sie sollte usi betrachten ng LEFT JOIN der [Arbeits Geschichte] Tabelle als Master-Tabelle, und verknüpfen Sie dann die anderen Tabellen, um es wie folgt aus:

SELECT WH.ID, W.createddate, WS.Statename AS Currentstate, WH.OldState, WH.Newstate, WH.transitiondate 
FROM [Work history] WH 
LEFT JOIN [Work] W on WH.workID = W.workID 
INNER JOIN [Work state] WS ON WS.StateID = W.StateID 

Lassen Sie mich wissen, ob es hilft!