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 ?(
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.
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
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.
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.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
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:
Alternativ geht so was Ähnliches in Oracle auch mit 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
Da seh ich das grad auch, du hast ja Oracle, nicht MsSql 😄
Sollte sich aber nicht viel ändern, wenn überhaupt
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
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