2017-02-24 3 views
1

Ich brauche etwas SQL-Hilfe. Ich bin ein Java-Typ von Beruf und ich weiß wirklich nicht einmal, wie man diese Frage stellt. Ich habe 3 Tische, nenne sie Person, Kinder, Freunde. Person ist eine ID und ein Name:SQL Outer Join eine Tabelle mit 2 Tabellen

| id | name | 
--------------------- 
| 1 | Joe  | 

Lassen Sie sagen, Kinder die gleiche ist, aber mit einem FK zurück zur Person

| id | personId | name | 
------------------------------------- 
| 1 |  1  | Frank | 
| 2 |  1  | Dan | 

und Freunde sind die gleiche Sache

| id | personId | name | 
------------------------------------- 
| 1 |  1  | Will | 
| 2 |  1  | Bob | 

Offensichtlich ist eine vereinfachte Version meines wirklichen Problems, aber die Struktur ist die gleiche. Ich brauche alle diese Daten in einer SQL-Pull zu ziehen, so dass ich diese zurück

| personId | personName | childId | childName | friendId | friendName 
------------------------------------------------------------------------------------------ 
|  1  | Joe  |  1  | Frank | null  | null 
|  1  | Joe  |  1  | Dan  | null  | null 
|  1  | Joe  | null | null |  1  | Will 
|  1  | Joe  | null | null |  2  | Bob 

Ich habe versucht, mehrere Techniken verbinden, kann aber nicht scheinen, um es zu knacken. SQL war nie mein bestes Thema. Jetzt bin Parsen ich diese in ein Java-Objekt Person mit Liste <> von Freunden und Kinder so offensichtlich auch dies funktioniert:

| personId | personName | childId | childName | friendId | friendName 
------------------------------------------------------------------------------------------ 
|  1  | Joe  | null | null | null  | null 
| null | null  |  1  | Frank | null  | null 
| null | null  |  1  | Dan  | null  | null 
| null | null  | null | null |  1  | Will 
| null | null  | null | null |  2  | Bob 

Alles, was eine saubere for-Schleife in meinem Code ermöglicht dies zu bauen.

Danke!

+0

Ich bin kein Experte, aber zwei volle Outer-Joins auf person.id = children.personId und person.id = friends.personId sollte funktionieren. Was hast du probiert und welche Ergebnisse hast du bekommen? – mreff555

+0

@ mref555 dies ist markiert MySQL – Strawberry

Antwort

4
select 
    p.id as personId 
    , p.name as personName 
    , c.id as childId 
    , c.name as childName 
    , null as friendId 
    , null as friendName 
from person p 
    inner join child c 
    on p.id = c.personId 
union all 
select 
    p.id as personId 
    , p.name as personName 
    , null as childId 
    , null as childName 
    , f.id as friendId 
    , f.name as friendName 
from person p 
    inner join friend f 
    on p.id = f.personId; 

rextester : http://rextester.com/BSPEC33394

kehrt:

+----------+------------+---------+-----------+----------+------------+ 
| personId | personName | childId | childName | friendId | friendName | 
+----------+------------+---------+-----------+----------+------------+ 
|  1 | joe  | 1  | frank  | NULL  | NULL  | 
|  1 | joe  | 2  | dan  | NULL  | NULL  | 
|  1 | joe  | NULL | NULL  | 1  | will  | 
|  1 | joe  | NULL | NULL  | 2  | bob  | 
+----------+------------+---------+-----------+----------+------------+ 
+0

Sind Sie sicher, dass innerer Join Nullen zurückgeben würde? Ich denke, dass Sie linke äußere Verbindung stattdessen verwenden sollten – bksi

+0

@bksi klicken Sie auf den Rextesterlink und sehen Sie heraus überprüfen. http://rextester.com/BSPEC33394 – SqlZim

1

Sie könnten mit der Vereinigung von Kindern und Freunden äußere Verknüpfung, und dann prüfen, sowohl die von Ihnen passen, um zu bestimmen, was in jeder Spalte Ausgang (mit case when):

select person.id, 
      person.name, 
      case when rel.kind = 1 then rel.id end as childId, 
      case when rel.kind = 1 then rel.name end as childName, 
      case when rel.kind = 2 then rel.id end as friendId, 
      case when rel.kind = 2 then rel.name end as friendName 
from  person 
left join (
      select id, personId, name, 1 as kind 
      from children 
      union all 
      select id, personId, name, 2 as kind 
      from friends 
     ) as rel 
     on rel.personId = person.id 
order by person.id, 
      rel.kind 
      rel.id 
0

Sie können LEFT JOIN diese acheive:

SELECT 
    p.id as personId 
    , p.name as personName 
    , c.id as childId 
    , c.name as childName 
    , f.id as friendId 
    , f.name as friendName 
FROM person p 
LEFT OUTER JOIN child c ON p.id = c.personId 
LEFT OUTER JOIN friend f ON p.id = f.personId; 

Weitere Informationen für links verbindet Sie können Sie hier lesen: https://www.w3schools.com/sql/sql_join_left.asp