2016-10-04 3 views
0

Lassen Sie uns sagen, dass ich die folgenden Tabellen:Erste Ergebnisse aus zwei verschiedenen Tabellen mit einem Join

+-------------------------------------------+ 
| t_classroom        | 
+-------------------------------------------+ 
| PK | id         | 
| | admin_user_id      | 
| | name         | 
| | students        | 
+-------------------------------------------+ 

+-------------------------------------------+ 
| t_shared         | 
+-------------------------------------------+ 
| | admin_user_id      | 
| | classroom_id       | 
| | expiry        | 
+-------------------------------------------+ 

Ich möchte eine Abfrage schreiben, die alle Klassenzimmer ziehen wird, dass ein admin_user_id Zugriff hat. Im Wesentlichen möchte ich eine Union von Klassenzimmer Zeilen, wenn ich suche nach admin_user_id in der t_classroom Tabelle sowie Klassenzimmer Zeilen, wenn ich suche nach admin_user_id in der t_shared Tabelle. Ich machte den folgenden Versuch:

SELECT 
    id, 
    admin_user_id, 
    name, 
    students 
    FROM 
    t_classroom 
    WHERE 
    admin_user_id = 1 
    UNION ALL 
    SELECT 
    c.id, 
    c.admin_user_id, 
    c.name, 
    students 
    FROM 
    t_classroom c 
    INNER JOIN t_shared s 
    ON c.id = s.classroom_id 
    WHERE 
    admin_user_id = 1 

Stimmt das oben genannte? Gibt es etwas effizienteres/saubereres?

+0

würden Sie bitte einige Beispieldaten und Ergebnis liefern ?? – Esty

Antwort

1

Je nachdem, wie viele Daten Sie haben, könnten Sie wahrscheinlich mit nur einer IN Klausel, um auf die andere Tabelle zu sehen bekommen.

SELECT 
    c.id, 
    c.admin_user_id, 
    c.name, 
    c.students 
    FROM 
    t_classroom c 
    WHERE 
    c.admin_user_id = 1 
    OR c.id IN (select s.classroom_id from t_shared s where s.admin_user_id = 1) 

Ihre Vereinigung wird nicht funktionieren, weil Sie auf die t_shared Tabelle links-Beitritt und nur das Klassenzimmer Admin-Benutzer zu überprüfen.

Wenn Sie dem gemeinsamen Raum beitreten, würden Sie auch mit Duplikaten enden und müssten das Ergebnis auch unterscheiden.

Edit:

Aufgrund der großen Anzahl von Zeilen könnte es besser sein, eine Überprüfung der zweiten Tabelle vorhanden zu verwenden.

SELECT 
    c.id, 
    c.admin_user_id, 
    c.name, 
    c.students 
    FROM 
    t_classroom c 
    WHERE 
    c.admin_user_id = 1 
    OR EXISTS (select 1 from t_shared s where s.classroom_id = c.id AND s.admin_user_id = 1) 
+0

Um nur einen Hinweis auf die Größe zu geben, würden beide Tabellen jeweils in 100 Millionen von Zeilen stehen –

0

Ihre Lösung ist grundsätzlich in Ordnung, ich nur zwei Probleme erkennen können, wenn Ihre Abfrage sind Anglotzen:

  • Sie benötigen s.admin_user_id statt admin_user_id in der letzten Zeile zu schreiben, eine Fehlermeldung zu vermeiden, , weil in beiden Tabellen eine Spalte dieses Namens vorhanden ist. Best Practice ist immer qualifizieren Sie Spaltennamen mit den Tabellennamen.

  • Vielleicht möchten UNION statt UNION ALL verwenden, wenn Sie ein Duplikat Ergebniszeile im Fall vermeiden wollen, dass beide Tabellen admin_user_id = 1 für die gleiche Klasse haben.

Verwandte Themen