Mehrere Ergebnisse bei einem Subselect

Jamel

Newbie
Registriert
Jan. 2020
Beiträge
4
Hallo zusammen,
ich habe folgendes Problem. Ich benötige eine Datenbankabfrage bei der ich mehrere Ergebnisse aus einem Subselect angezeigt bekommen möchte.
Ich benötige den Subselect, da ich auf unterschiedliche Datensätze der gleichen Tabelle zugreifen muss.
Genau gesagt brauche ich alle Materialien mit den dazugehörigen Mengen von der Tabelle Aufstuelipos bei denen das Feld Urebene eines anderen Datensatzes der Tabelle Aufstuelipos dem Feld Struktur entspricht und zugleich das Feld Aufstueli bei beiden Datensätzen gleich ist:
Meine verkürzte SQL-Abfrage sieht momentan folgendermaßen aus:
Code:
Select Wauftragpos.T_SOLL as Sollzeit,  Material  = (Select Artikel from Aufstuelipos where Aufstueli = Aufstuelipos.Aufstueli and Struktur =Aufstuelipos.UREBENE)

from Wauftragpos

Join AUFSTUELIPOS

on Wauftragpos.BAUFTRAG = Aufstuelipos.Aufstueli and Aufstuelipos.Start = Wauftragpos.Start and Wauftragpos.APLAN = Aufstuelipos.Artikel

Das Problem ist nun jedoch, dass ich für ein Feld natürlich nur einen Wert zurückgeben kann. Gibt es eine Möglichkeit mir entsprechend der Anzahl der Ergebnisse Felder zurück zu geben?
 
Zuletzt bearbeitet:
Material = ()
Material in ()
 
  • Gefällt mir
Reaktionen: RalphS
Poste bitte einen Auszug aus deiner Tabelle. SQL-Statements bitte in code-Tags packen (Beitrags-Menü rechts neben den Smileys -> einfügen -> code).
 
  • Gefällt mir
Reaktionen: Hayda Ministral
Subquery nicht ins SELECT, sondern darauf JOINen. Oder ein OUTER APPLY oder sowas, wenn kein JOIN gewünscht ist und du die Materialien bspw. in einer Spalte auflisten möchtest.
 
  • Gefällt mir
Reaktionen: RalphS
Bei der Tabelle handelt es sich um eine Seite aus einem ERP-System.
1579522042046.png

Ich habe die Felder die für die Abfrage benötigt sind nun gelb markiert und die die ich mir später ausgeben möchte Türkis. Es reicht mir jedoch wenn zunächst nur der Artikel angezeigt wird, dass andere kann ich mir anschließend selbst zusammen bauen.
Das Problem besteht vor allem darin, dass in meinem Subselect gewollt auch auf mehr als einen Datensatz zugegriffen werden kann.
 
Schreib doch mal auf, wie das Ergebnis aussehen soll. In eine Spalte einer Zeile passt halt nur ein Wert.
 
1579522805276.png

So ungefähr stelle ich mir das vor. Es sollte natürlich unbegrenzt nach Anzahl der Datensätze auf die zugegriffen wird erweiterbar sein.
 
Das heißt die Anzahl der Spalten soll dynamisch sein?
Das wird kompliziert, geht dann nur mit Dynamic SQL oder Pivot, oder was dein DBMS so hergibt.
Mach das ganz "normal" mit festen Spalten und JOINs. Die GUI ist dafür verantwortlich die Daten nachher nett aufzubereiten, nicht die Datenbank.
 
  • Gefällt mir
Reaktionen: Raijin und Jamel
Das war meine Idee ja.
Okay alles klar vielen Dank. Dann versuche ich es auf einem anderen Weg darzustellen.
 
Enurian schrieb:
Die GUI ist dafür verantwortlich die Daten nachher nett aufzubereiten, nicht die Datenbank.
So sieht's aus. Bevor man ellenlange SQL-Statements schreibt, die am Ende keine Sau mehr begreift, ruft man die Daten auf herkömmliche Art und Weise ab und bereitet sie in der Anwendung auf. Insbesondere wenn man massiv proprietäre Techniken einsetzt, kann das sonst mächtig in die Hose gehen, wenn man auf ein anderes Datenbanksystem migriert - aus welchen Gründen auch immer man das tut.
 
"Variable Anzahl" in SELECT kann nicht funktionieren, dafür gibt es nur * oder explizite Spaltenangaben. Das geht auch nicht mit IN - den kann man in WHERE oder anderen Filtern verwenden, aber nicht in SELECT.

Ob das jetzt der passende Weg ist, meh, vor allem bei ERP.... aber an der Stelle lautet der erste Ansatz Self Join.
Selfjoin heißt Alias (sollte man sich eh angewöhnen).

Der zweite Weg sind CTE, aber die sind DBMS-spezifisch.

Beispiel: Ich hab eine Tabelle Angestellte. Jeder Angestellte kann einen Vorgesetzten haben - hat auch einen, außer dem Top dog, der hat entweder gar keinen oder sich selber oder einen speziellen "root-Eintrag".

Die Tabelle könnte dann so aussehen:
Code:
ID VG Name
01 null Chefchen
02 01 Subchefchen_A
03 01 Subchefchen_B
04 02 Mitarbeiter_Team_A
05 03 Mitarbeiter_Team_B

Das ist eine kleine angedeutete Hierarchie mit einer Wurzel, zwei untergeordneten Knoten an der Wurzel und nochmal jeweils einem beispielhaften Kinderknoten auf der zweiten Ebene.

Wer ist jetzt der nächste Vorgesetzte von jedem Angestellten?

SQL:
SELECT t1.name angestellter, t2.name Vorgesetzter
FROM tabelle t1
JOIN tabelle t2 ON t1.vg = t2.id
Note: INNER JOIN, Chefchen hat VG IS NULL, daher taucht er nicht im JOIN auf. Man könnte auch seine ID als VG wiederholen oder 0 reinschreiben (und müßte bei ID=0 noch einen geschützten Wert eintragen, der keinen Angestellten repräsentiert) je nachdem was gefällt.

Wenn man die Kette haben will von einer beliebigen Person nach ganz oben, dann braucht man den CTE. Je nach Datenbanksystem zB per CONNECT BY. Dann muß man angeben, was der Basisausdruck ist (sowas wie select name from tabelle) und muß dann hinzufügen, wie abhängige Datensätze angehängt werden müssen (connect by vg = prior id).

Näheres bei Bedarf in der Doku des jeweiligen DBMS.
 
Zurück
Oben