Laden...

Subselect mit Join

Erstellt von gnc vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.559 Views
gnc Themenstarter:in
125 Beiträge seit 2008
vor 10 Jahren
Subselect mit Join

verwendetes Datenbanksystem: SQLSERVER,ORACLE

Hallo Community,
ich komme grad nicht weiter 🤔
Das angehängte Bild erklärt mein Problem. Ich brauche einen Select, welches mir die 2 Felder (Spalte x, und Spalte y) in einem Satz liefert.

Select A.KeySpalte1, A.KeySpalte2, B.Spaltex FROM A ,B
WHERE
B.KeySpalte1 (+) = A.KeySpalte1 AND
B.KeySpalte2 (+) = A.KeySpalte2 AND
B.KeySpalte3(+) = 1

ist natürlich falsch

Das müsste doch eigentlich mit Subselects funktionieren, aber ich kriegs irgendwie nicht hin.
Bitte um Ratschläge ?(

W
955 Beiträge seit 2010
vor 10 Jahren

Hi,

das geht so nicht, Du verläßt die 2NF.
Gibt es denn eine Obergrenze, dass z.B.maximal drei B's zu A gejoint werden?
Ansonsten helfen vllt Pivottabellen oder im Client lösen.

gnc Themenstarter:in
125 Beiträge seit 2008
vor 10 Jahren

ja, ich brauche nur die ersten 2 B's und immer mit KeySpalte = 1 und 2

geben kann es mehrere => ja
also alles in einem select ist nicht möglich?

Anders erklärt:
Kopftabelle Firma = > im Beispiel A
Pos.tabelle Kunden => im Beispiel B

ich will also die ersten 2 Kunden(B) von einer Firma(A) anzeigen

W
955 Beiträge seit 2010
vor 10 Jahren

Du könntest dann erst einmal nur die Tabelle B betrachten und sie mit sich selbst joinen:


SELECT B1.KeySpalte1,B1.KeySpalte2,B1.SpalteX AS N1,B2.SpalteX AS N2
FROM B B1, B B2
WHERE B1.KeySpalte1=B2.KeySpalte1
AND B1.KeySpalte2=B2.KeySpalte2
AND B1.KeySpalte3=1
AND B2.KeySpalte3=2

Ich habe das jetzt einfach aus dem Kopf geschrieben, den Oracke-Join mußt Du anpassen und dann evtl. die andere Tabelle joinen wenn Du sie überhaupt brauchst.

2.078 Beiträge seit 2012
vor 10 Jahren

Wie schon erwähnt, mit PIVOT sollte das gehen:

Verwenden von PIVOT und UNPIVOT

SELECT KeySpalte1, KeySpalte2, [1] AS [3. Key = 1], [2] AS [3. Key = 2]
FROM
(
    SELECT A.KeySpalte1, A.KeySpalte2, B.KeySpalte3, B.SpalteX
    FROM [Haupttabelle A] AS A
        JOIN [Untertabelle B] AS B ON A.KeySpalte1 = B.KeySpalte1 AND A.KeySpalte2 = B.KeySpalte2
) AS sourceTable
PIVOT
(
    MAX(SpalteX)
    FOR KeySpalte3 IN
    ( [1], [2] )
) AS pivotTable

Schau mal ob das so in dem Prinzip funktioniert. Hab ein Weilchen nicht mehr mit PIVOT gearbeitet 😄

Nachteil von dem System ist aber, dass du die Menge an Werte in der KeySpalte3 kennen musst.
Auf Arbeit haben wir es daher so gemacht, dass wir die Spalten, die in den Tabellenkopf kommen, vorher ausgelesen haben, oder die Anzahl. Das hat sich da gelohnt, da der Umfang an Daten deutlich größer war, bei dir währe es aber vermutlich schneller, einfach normal auszulesen und anschließend mit C# so zusammen zu setzen, wie du es haben möchtest.

Du kannst dir ja auch einen Fake-DataReader bauen, den du mit den zurecht gebauten Daten fütterst und der nach Außen dann eine Datenbank-Abfrage vor spielt. So musst du dann nichts anderes abändern und kannst in der Fetcher-Klasse, die das auslesen soll, diesen kleinen Umweg gehen.

F
115 Beiträge seit 2012
vor 10 Jahren

Hi,

wenn ich Dich recht verstehe möchtest Du die Daten pivotisieren. Dies ist keine SQL Standard Funktionalität, wird aber von Oracle unterstützt:

ORACLE: Pivot and Unpivot

Alternativ geht so was Ähnliches in Oracle auch mit Listagg:

ORACLE: LISTAGG

Oder natürlich mit dem Selfjoin wie von "witte" beschrieben. Das hat den Charme, dass das Ansi-SQL ist, wird aber bei mehr Spalten irgenwann unleserlich und langsamer als PIVOT (bei Oracle).

Gruß
f_igy

2.078 Beiträge seit 2012
vor 10 Jahren

Da seh ich das grad auch, du hast ja Oracle, nicht MsSql 😄

Sollte sich aber nicht viel ändern, wenn überhaupt

gnc Themenstarter:in
125 Beiträge seit 2008
vor 10 Jahren

Vielen Dank, die Variante von witte hat funktioniert.
Da es für "einige" Datenbanken funktionieren muss, kann ich es nicht mit PIVOT un UNPIVOT lösen