2016-08-10 2 views
1

ist Ich habe 3 Tabellen. Sie alle repräsentieren eine andere Phase eines Prozesses.Tabellen in SQL verbinden, wenn Tabellenwert gleich

Tabelle 1:

ID Process1 

1 a  
2 b 
3 c 
4 d 

Tabelle 2:

ID ID2  Process2 
1 50  e 
2 51  f 
4 52  g 

Tabelle 3:

IDfromPrevious ID3 Process3 
50    500 h 
51    501 i 
52    502 j 
3    503 k 

Ich möchte 4 Tabelle erstellen:

ID3 Process1 Process2 Process3 
500 a   e   h 
501 b   f   i 
502 d   g   j 
503 c      k 

Das Problem besteht darin, dass ein Element von Prozess 1 nach 3 verschoben wird. Andere Elemente werden von Prozess 1 nach 2 zu 3 verschoben. Alles endet jedoch in Prozess 3. Außerdem wird dem Element über jeden Prozess eine neue ID zugewiesen. Ich arbeite in MS Access 2016.

Ich weiß nicht, wo ich mit der SQL-Anweisung beginnen soll. Ich habe noch nie, wenn Anweisungen in SQL geschrieben, aber ich möchte, dass die Logik, so etwas arbeiten:

SELECT Table3.ID3, Table1.Process1, Table2.Process2, Table3.Process3 
FROM (IF Table1.ID = Table3.IDfromPrevious Then Table1 INNER JOIN Table3 ON Table1.ID = Table3.IDfromPervious ELSE Table2.ID2 = Table3.IDfromPrevious Then Table2 INNER JOIN Table3 ON Table2.ID2 = Table3.IDfromPervious) 
+0

In SQL-Abfragen ist keine bedingte Ausführung verfügbar. – jarlh

+0

ist es möglich, eine IDfromPrevious in Tabelle3, die sowohl in Tabelle1 und Tabelle2 vorhanden ist? – MtwStark

+0

Woher wissen Sie, dass 'IDFromPrevious' von 3 aus Tabelle 1 und nicht aus Tabelle 2 stammt? Ich würde auch vorschlagen, dass Sie Google "SQL-Bäume und Hierarchien Joe Celko". Er hat ein ganzes Buch über das Thema geschrieben, obwohl Sie genug Informationen bekommen können, um diese Daten korrekt zu modellieren, nur aus einigen seiner Nachrichtengruppen und Forenbeiträge. –

Antwort

0

MS Access ist nur eine Teilmenge der Standard ISO SQL unterstützt. Nach mehreren Versuchen scheint dies nur über eine Unterabfrage möglich zu sein. Das Unterabfrage kann dann äußere mit einem Nz Zustand verbunden wie folgt:

SELECT Table3.ID3, Table12.Process1, Table12.Process2, Table3.Process3 
FROM  (SELECT Table2.ID2, Table1.ID, Table1.Process1, Table2.Process2 
      FROM  Table1 
      LEFT JOIN Table2 ON Table2.ID = Table1.ID) AS Table12 
LEFT JOIN Table3 ON Table3.IDfromPrevious = Nz(Table12.ID2, Table12.ID) 
+0

Ich erhalte einen Syntaxfehler. Es heißt: "Syntaxfehler im Abfrageausdruck" Table3 ON Table3.IDFromPrevious IN (Table1.ID, Table2.ID2) '. " –

+0

Sie müssten sagen 'LEFT JOIN Tabelle3 ON Table3.IDFromPrevious = Table1.ID ODER Table3.IDFromPrevious = Table2.ID2' –

+0

Ich habe das als Alternative hinzugefügt. MS Access hat viele Einschränkungen im Vergleich zu Standard-SQL. Möglicherweise wird 'Nz' funktionieren. Hinzugefügt, dass als eine andere Alternative. – trincot

0
DECLARE @Table1 TABLE 
(
ID INT 
,Process1 VARCHAR(10) 
) 

INSERT INTO @Table1 
VALUES 
(1,'a') 
,(2,'b') 
,(3,'c') 
,(4,'d') 

DECLARE @Table2 TABLE 
(
ID INT 
,ID2 INT 
,Process2 VARCHAR(10) 
) 

INSERT INTO @Table2 
VALUES 
(1,50,'e') 
,(2,51,'f') 
,(4,52,'g') 



DECLARE @Table3 TABLE 
(
IDfromPrevious INT 
,ID3 INT 
,Process3 VARCHAR(10) 
) 

INSERT INTO @Table3 
VALUES 
(50,500,'h') 
,(51,501,'i') 
,(52,502,'j') 
,(3,503,'k') 

SELECT * FROM @Table1 
SELECT * FROM @Table2 
SELECT * FROM @Table3 


SELECT 
ID3 
,Process1 
,Process2 
,Process3 
FROM @Table1 T1 
LEFT JOIN @Table2 T2 ON T1.ID = T2.ID 
LEFT JOIN @Table3 T3 ON T3.IDfromPrevious IN (T2.ID2,T1.ID) 

enter image description here

0

es die einfache Art und Weise zu tun, beide Bedingungen beitreten und halten Sie dann die nicht NULL

select t3.ID3, isnull(t1.process1, tx.Process1) Process1, t2.Process2, t3.Process3 
from t3 
left join t2 on t3.IDfromPrevious = t2.ID2 
left join t1 on t2.ID = t1.ID 
left join t1 tx on t3.IDfromPrevious = tx.ID 
Verwandte Themen