SQL mehrere Zeilen aus subselect anzeigen

S

Sasku

Gast
Hey Leute,

ich habe in MySql eine Abfrage, in der ich einen Subselect habe... dieser soll mehrere Ergebnisse liefern, bzw liefern können. Und diese Werte die Dort herauskommen sollen wiederrum weiterverwendet werden.

Code:
select Distinct p.Lastname, p.Firstname, g.* from gptransferplan g, gpperson p, gpjob j 
where p.isInstructor = 'no' and p.isAdvisor = 'no'
and (( (Select JobID from gpjob j where j.InstructorID = " + PNR + ") = p.JOBID   ) or ( g.PNR = " + PNR + " and  p.PNR = " + PNR + ") )
order by g.PNR, g.Datum;

das ist der komplette Select bisher... der wichtige Teil, also um den es hier geht ist der hier:

Code:
 (( (Select JobID from gpjob j where j.InstructorID = " + PNR + ") = p.JOBID   )

in "PNR" steht eine Zahl... also besser gesagt die InstructorID ( Ausbildernummer ) .. Wenn ich jetzt die Nummer eines Ausbilders eingebe können da bis zu 6 Einträge pro Nummer sein ... wie kann ich jetzt also das was bei dem Subselect rauskommt mit p.JobID abgleichen?
 
Sasku schrieb:
... wie kann ich jetzt also das was bei dem Subselect rauskommt mit p.JobID abgleichen?

Ohne jetzt alles im Detail zu analysieren würde ich es mal so versuchen:

Code:
... where p.JobID in (Select JobID from gpjob j where j.InstructorID = " + PNR + ")
 
subselect ist eigentlcih ein no go. ein ganz normaler join sollte es auch tun. am besten beschreibst du kurz deine tabellen und was du mit der abfrage für ein ziel verfolgst. dann kann man dir besser helfen.
 
Eine Subquery kannst du i.d.r. nicht in der Ober abfrage verwenden da der DBA die Abfragen parallelisiert und somit die Daten nicht immer zur gleichen Zeit zur Verfügung stellt.

Alternativen währen der Join, eine UNION Klausel oder ein WITH Klausel (welche deinem Anliegen schon am nächsten kommt.)

Anbei mal als With:
WITH q AS (Select JobID from gpjob j where (j.InstructorID = " + PNR + " = p.JOBID) or (g.PNR = " + PNR + " and p.PNR = " + PNR + ")
select Distinct p.Lastname, p.Firstname, g.* from gptransferplan g, gpperson p, gpjob j
where p.isInstructor = 'no' and p.isAdvisor = 'no'
and JobID in q
order by g.PNR, g.Datum;
 
Zuletzt bearbeitet:
tm0975 schrieb:
subselect ist eigentlcih ein no go. ein ganz normaler join sollte es auch tun. am besten beschreibst du kurz deine tabellen und was du mit der abfrage für ein ziel verfolgst. dann kann man dir besser helfen.

Mein Select soll am Ende den Versetzungsplan für alle Azubis ausgeben die der jeweilige Ausbilder hat ... Wenn sich beispielsweise Ausbilder X anmeldet und darauf zugreift sollen Azubi ABC angezeigt werden ( also der Versetzungsplan ) ...

Tabellen ..

ähm Relevant dafür sind gptransferplan ( Versetzungsplan ) ...
und dort Relevat sind die Personalnummer ( PNR .. identisch mit der aus GPPerson ) ... dadruch wird die jeweilige Person erkannt ... dann das jeweilige Datum .. und die TPID .. aber beim progammieren ist nur die PNR wichtig..

dann gpjob
JOBID .. sind die Kürzel für den jeweiligen Beruf ... und die InstructorID .. also die ausbildernummer ( identisch mit der PNR in gpperson )

und dann noch gpperson
dort stehen alle Personen drinnen die mit der Ausbildung zu tun haben .. Also Azubis .. Ausbilder .. und die Betreuer der Ausbilder
dort wichtig sind die PNR ... die ist der Primary Key .. dann hald vor und Nachname .. und dann noch die JOBID ... die ist identisch mit der von gpjob ^^
Ergänzung ()

Fame93 schrieb:
Eine Subquery kannst du i.d.r. nicht in der Ober abfrage verwenden da der DBA die Abfragen parallelisiert und somit die Daten nicht immer zur gleichen Zeit zur Verfügung stellt.

Alternativen währen der Join, eine UNION Klausel oder ein WITH Klausel (welche deinem Anliegen schon am nächsten kommt.)

danke ... ich werde es später mal ausprobieren :)
 
funktioniert dass with dann wie eine ForEach Schleife ( z.b. in Java oder C# ) ? ... WITH kannte ich bisher nich ...

heist es werden dort die Ergebnisse nacheinander in q geschrieben und danach q in der nachfolgenden abfrage verwendet und danach das nächste Ergebnis rausgenommen oder wie? ..

hab es mal probiert und dann noch das " + PNR + " durch einen Wert ersetzt .. und danach noch die Synthax Fehler ersetzt .. jetzt sieht es so aus:

Code:
 WITH q AS ((Select j.JobID from gpjob j, gpperson p, gptransferplan g where j.InstructorID = 30001) or (g.PNR = 30001 and p.PNR = 30001))
 select Distinct p.Lastname, p.Firstname, g.* from gptransferplan g, gpperson p, gpjob j 
 where p.isInstructor = 'no' and p.isAdvisor = 'no'
 and JobID in q
 order by g.PNR, g.Datum;


Problem ... es funktioniert dennoch nich ...
 
Nein - die WITH Klausel gibt dir eine Menge von Ergebnissen, keine einzielen Tupel!

Wenn du so etwas wie eine Schleife Realisieren willst musst du eine Prozedur oder Stored Procedure schreiben
bei Oracle z.B. in PL/SQL.

Ein Schleifenartiges Konstrukt wäre dann ein Cursor, welcher dann aber nicht mehr ganz so einfach zu erklären ist.

Gruß
 
Zuletzt bearbeitet:
ah und dann sind in q also alle Ergebnisse die diese abfrage zurückgibt.. ^^
 
Zurück
Oben