2016-07-16 12 views
0

Ich muss links zwei Tabellen verbinden, wo von der rechten Tabelle brauche ich einige Spalten auf eine Join-Bedingung von drei Spalten und einige Spalten auf Join-Bedingung von zwei ähnlich, aber eine andere Spalte (wieder 3 Spalten) und einige Spalten auf Join-Bedingung von eine Spalte (die eine der nicht übereinstimmenden Spalten in vorherigen Joins ist).Wie kann die Anzahl der Joins reduziert werden?

Lassen Sie mich zum Beispiel erklären

Tabelle A hat Spalten a1, a2, a3, a4, a5 Tabelle B Spalten b1, b2, b3, b4, b5, b6, b7

I Now benötigen

  • a1, a2
  • ,
  • a3, a4, b1
  • wenn a2 = b2, a3 = b3, a4 = b4,
  • b6, wenn a2 = b5, a3 = b3, a4 = b4,
  • b7, wenn a2 = b2

Jetzt Wie kann ich dies erreichen, ohne die Tabellen mehrmals Beitritt oder als weniger Zeit wie möglich. Mit CASE WANN DANN Struktur oder etwas anderes. Die Abfragen sind für Hive, aber die meisten SQL-Funktionen werden unterstützt. Hive hat verschiedene Optimierungstechniken, aber sql Jungs sind willkommen.

Vielen Dank im Voraus für Ihre Mühe.

+0

Beispieldaten und gewünschte Ergebnisse würden den Leuten wirklich helfen zu verstehen, was Sie tun möchten. –

Antwort

0

Ich bin mir ziemlich sicher hive unterstützt conditional aggregation. Wenn ich Ihre Frage richtig zu verstehen, sollten Sie in der Lage sein, das verwenden, um mit einem cross join:

select a1, a2, a3, a4, 
     max(case when a2 = b2 and a3 = b3 and a4 = b4 then b1 end) b1, 
     max(case when a2 = b5 and a3 = b3 and a4 = b4 then b6 end) b6, 
     max(case when a2 = b2 then b7 end) b7 
from a cross join b 
group by a1, a2, a3, a4 
+0

Hallo, Danke für die Wiederholung, ich muss eine Linke beitreten, wäre es das gleiche wie Cross hier beitreten? Und ich verstehe nicht, warum ich Max Funktion verwenden muss? –

+0

@HimanshuMehra - welche Tabelle benötigen Sie in der 'Outer Join'? Dies sollte alle Ergebnisse von "a" mit den übereinstimmenden Werten in "b" zurückgeben. 'max' wird mit' conditional aggregation' verwendet, im Grunde das Pivotieren von Tabellen (eine Alternative zu mehreren Joins). – sgeddes

+0

@sgedds Es tut mir leid, dass ich neu in sql und bive bin, daher verstehe ich immer noch nicht, wie und warum die Tabelle gedreht wird. Die maximale Funktionsdefinition lautet 'Gibt den maximalen Wert der Spalte in der Gruppe zurück.' Und ich denke, das bedeutet, wenn Sie es mehrere Spalten übergeben, wird es die, die höheren Wert für den jeweiligen Datensatz hat. Habe ich recht? Danke für die Hilfe. EDIT: Aber Max-Funktion scheint nur einen Wert zu nehmen –

0

Sie mögen mehr tun verbindet:

select a.a1, a.a2, a.a3, a.a4, b1.b1, b2.b6, and b3.b7 
from a join 
    b b1 
    on a.a2 = b1.b2 and a.a3 = b1.b3 and a.a4 = b1.b4 join 
    b b2 
    on a.a2 = b2.b5 and a.a3 = b2.b3 and a.a4 = b2.b4 join 
    b b3 
    on a.a2 = b.b2; 

Sie left join benötigen, wenn einige Bedingungen nicht tun Spiel.

+0

Aber OP sagt spezifisch: 'Jetzt Wie erreiche ich das, ohne die Tabellen mehrfach zu verbinden. Ich stimme zu, dass das funktionieren würde. – sgeddes

+0

@sgeddes. . . Ich denke, das ist die beste Lösung für das Problem, das das OP beschreibt, vor allem angesichts der Umgebung, in der er arbeitet. –

+0

Fair genug, kann nicht argumentieren, dass dies eine bessere Leistung als ein 'Cross Join' haben könnte. Vielleicht sollte ich die Frage ja nicht so wörtlich lesen ... – sgeddes

Verwandte Themen