2017-11-13 3 views
0

Dies sind die 2 Tabellen. Tech_data:Join mehrere Male in SQL

Id Tech Agent1_id Agent2_ID 
1 JAVA 1   2 
2 SQL 3   4 

Agent_table

Id Name 
1 Mike 
2 John 
3 Jim 
4 Baron 

Ich brauche eine Abfrage zu schreiben, die unter Ausgabe

TECH_ID Tech Agent1_Name Agent2_Name 
1   Java Mike  John 
2   SQL  Jim  Baron 

Ich schrieb ON LEFT OUTER JOIN tech_id = agent1_id zu bringen, aber ich weiß nicht wissen, wie man 2 IDs in ON-Bedingung verbindet.

+0

Es sieht aus wie Sie K Vereinigung wählt für Ihre K-Spalten. In diesem Fall K = 2. Zeigen Sie uns auf eine Geige, damit wir Details eingeben können: http://sqlfiddle.com/ –

Antwort

3

Um zu verhindern, dass mehrere schließt sich an einen Tisch zu tun, können Sie UNPIVOT, verbinden und dann schwenken (dann, wenn Sie 50 ID-Spalten hatte würden Sie nur noch ausführen müssen, eine Join):

SQL Fiddle

Oracle 11g R2 Schema Einrichtung:

CREATE TABLE Tech_data (Id, Tech, Agent1_id, Agent2_ID) AS 
SELECT 1, 'JAVA', 1, 2 FROM DUAL UNION ALL 
SELECT 2, 'SQL', 3, 4 FROM DUAL; 

CREATE TABLE Agent_table (Id, Name) AS 
SELECT 1, 'Mike' FROM DUAL UNION ALL 
SELECT 2, 'John' FROM DUAL UNION ALL 
SELECT 3, 'Jim' FROM DUAL UNION ALL 
SELECT 4, 'Baron' FROM DUAL; 

Abfrage 1:

SELECT * 
FROM (
    SELECT t.id, 
     t.tech, 
     t.num, 
     a.name 
    FROM (
     SELECT * 
     FROM tech_data 
     UNPIVOT (Agent_ID FOR num IN (Agent1_id AS 1, Agent2_id AS 2)) 
    ) t 
    INNER JOIN Agent_table a 
    ON (t.agent_id = a.id) 
) 
PIVOT (MAX(name) FOR num IN (1 AS Agent1_Name, 2 AS Agent2_Name)) 

Results:

| ID | TECH | AGENT1_NAME | AGENT2_NAME | 
|----|------|-------------|-------------| 
| 1 | JAVA |  Mike |  John | 
| 2 | SQL |   Jim |  Baron | 
1

Sie können einen zweiten linken äußeren Join genau wie den von Ihnen verwendeten auf derselben Tabelle hinzufügen, indem Sie ihnen wie folgt verschiedene Aliase zuweisen.

select t.Id tech_id, t.tech, a1.name, a2.name 
from tech_data t 
left outer join agent_table a1 on a1.Id = t.agent1_id 
left outer join agent_table a2 on a2.Id = t.agent2_Id; 

die Geige unter Kontrolle: http://sqlfiddle.com/#!4/73f02b/1

+0

Gut - dieser Ansatz würde gut zu einer Reihe von Spalten skalieren. –

+0

@roshan Danke. Die Gesamtzahl der Zeilen in der Tech-Tabelle beträgt 582 Zeilen, nach diesen 2 Joins beträgt die Gesamtzahl der abgerufenen Zeilen 669. Ich habe einen Null-Check wie folgt hinzugefügt: 'a1.Id ist nicht null oder a2.Id ist nicht null' aber dint work. – Pat

+1

@J_H Ich hoffe das ist sarkastisch. Es wird eine Tabellen- (oder Index-) Überprüfung für jeden Join durchgeführt, so dass 50 Spalten vorhanden sind und ein Join für jeden durchgeführt wird, um 50 Tabellen- (oder Index-) Scans der 'agent_table' durchzuführen. Sie können dies im Ausführungsplan der verknüpften SQL-Fiddle sehen. – MT0