Ok, ich nehme an, dass es jetzt läuft?
Eine Diskussion über sql: "having klausel" ersetzen im Forum Hausaufgaben. Teil des OFF-Topic-Bereichs; Ok, ich nehme an, dass es jetzt läuft?...
sodele. nachdem ich mich nun abgeregt habe, ging die bastelei weiter und mittlerweile raucht mir die birne. 2 dinge habe ich versucht:
deinen code gering überarbeitet mit krasser wirkung.
es führte dazu, dass zum jeweiligen ma jeder einsPers.DatumVon asugegeben wurde, also quasi das datumVon zu jedem einsatz, was ich nciht so ganz nachvollziehen kannCode:SELECT DISTINCT personal.personalnr, personal.nachname, personal.vorname, personal.kostenst AS KS_Personal, personal.eintritt1, personal.persstatus, auftrag.auftragnr, auftrag.kostenst AS KS_Auftrag, auftrag.vonDatum AS vonDatum, einsPers.DatumVon AS DatumVon FROM personal INNER JOIN einsPers ON personal.personalnr = einsPers.personalnr INNER JOIN auftrag ON ( auftrag.auftragnr = ( SELECT MAX(auftrag.auftragnr) FROM einsPers, auftrag WHERE auftrag.auftstatus = 2 AND personal.personalnr = einsPers.personalnr AND auftrag.auftragnr = einsPers.auftragnr ) ) WHERE personal.persstatus = 2 OR personal.persstatus = 7 ORDER BY personal.nachname ASC
meine eigenkreation:
die DatumVon-Spalte beinhaltet nur noch den höchsten Wert, aber den gleichen für jeden ma.Code:SELECT DISTINCT personal.personalnr, personal.nachname, personal.vorname, personal.kostenst AS KS_Personal, personal.eintritt1, personal.persstatus, auftrag.auftragnr, auftrag.kostenst AS KS_Auftrag, einsPers.DatumVon AS DatumVon FROM personal INNER JOIN einsPers ON ( einsPers.DatumVon = ( SELECT MAX(einsPers.DatumVon) FROM einsPers, auftrag, personal WHERE auftrag.auftstatus = 2 AND personal.personalnr = einsPers.personalnr AND auftrag.auftragnr = einsPers.auftragnr ) ) INNER JOIN auftrag ON auftrag.auftragnr = einsPers.auftragnr WHERE personal.persstatus = 2 OR personal.persstatus = 7 ORDER BY personal.nachname ASC
es gibt nur 2 verschiedene KS_Auftrag und AuftragNr - und zwar vertikal abwechselnd und horizontal immer identisch. so:
12200 | 40500073
17300 | 26500271
12200 | 40500073
17300 | 26500271
ich checks nciht mehr![]()
Dies liegt daran, das die Tabelle "einsPers"
nur über die Bedingung
Verknüpft wurde, diese passt jedoch zu jedem Auftrag.Code:personal.personalnr = einsPers.personalnr
Dies liegt hauptsächlich daran, dass du die Tabelle personal in das Subselect der ON-Klausel mit aufgenommen hast.
Dies ist jedoch nicht gewollt, da man dann keinen Bezug zum eigentlichen "personal.personalnr" herstellen kann.
Ohne zu prüfen sollte es so aussehen:
Code:SELECT DISTINCT personal.personalnr, personal.nachname, personal.vorname, personal.kostenst AS KS_Personal, personal.eintritt1, personal.persstatus, auftrag.auftragnr, auftrag.kostenst AS KS_Auftrag, auftrag.vonDatum AS vonDatum, einsPers.DatumVon AS DatumVon FROM personal INNER JOIN einsPers ON einsPers.DatumVon = ( SELECT MAX(einsPers.DatumVon) FROM einsPers, auftrag WHERE auftrag.auftstatus = 2 AND personal.personalnr = einsPers.personalnr AND auftrag.auftragnr = einsPers.auftragnr ) INNER JOIN auftrag ON auftrag.auftragnr = einsPers.auftragnr WHERE personal.persstatus = 2 OR personal.persstatus = 7 ORDER BY personal.nachname ASC
aber ohne personal bekommt er die spalte doch nichtCode:SELECT DISTINCT personal.personalnr, personal.nachname, personal.vorname, personal.kostenst AS KS_Personal, personal.eintritt1, personal.persstatus, auftrag.auftragnr, auftrag.kostenst AS KS_Auftrag, auftrag.vonDatum AS vonDatum, einsPers.DatumVon AS DatumVon FROM personal INNER JOIN einsPers ON einsPers.DatumVon = ( SELECT MAX(einsPers.DatumVon) FROM einsPers, auftrag WHERE auftrag.auftstatus = 2 AND personal.personalnr = einsPers.personalnr AND auftrag.auftragnr = einsPers.auftragnr ) INNER JOIN auftrag ON auftrag.auftragnr = einsPers.auftragnr WHERE personal.persstatus = 2 OR personal.persstatus = 7 ORDER BY personal.nachname ASC
ist das nicht widersprüchlich in bezug auf dein Dies liegt hauptsächlich daran, dass du die Tabelle personal in das Subselect der ON-Klausel mit aufgenommen hast.
Dies ist jedoch nicht gewollt, da man dann keinen Bezug zum eigentlichen "personal.personalnr" herstellen kann.
konnte ich aber jetzt auch noch nciht testen. ich habe die 3 tabellen aber mitnehmen dürfen, da ich morgen nicht im unternehmen bin. werde sie lokal in eine db einpflegen und dann testen.
mal so als zwischenanalyse, wobei ich davon ausgehe, dass du wesentlich mehr theoretisch arbeiten musst, da du im gegensatz zu mir nicht alle daten hast (ich kann die wahrheit vertragen^^):
1. scheine ich einfach zu wenig skill zu haben?
2. fehlt mir das verständnis?
3. ist das dbms sql-technisch zu unterbelichtet?
4. sonstiges
5. ne mischung (welche?) aus vorigen punkten?
Doch, denn die Verbindung zur personal Tabelle wird schon aßerhalb des INNER JOIN erstellt und zwar mit
Ich kann mir aber vorstellen, dass es für dich unerwartet ist, dass dies auch innerhalb des Subselects genutzt werden kann, jedoch muss ein Subselect ja auch einen Vorteil im Gegensatz zu einem reinen zusätzlichen Select haben, sonst würde dessen Einführung ja keinen Nutzen haben.Code:FROM personal
Wenn ich es beurteilen sollte, dann würde ich auf 1. und 2. setzen, jedoch liegt dies meiner Ansicht nach wohl hauptsächlich an 4., der fehlenden Erfahrung.
Ehrlich gesagt bin ich aber auch kein guter Maßstab, da ich mich damit schon sehr lange beschäftige und mir solche Sachen entsprechend leichter fallen.
Aber genau darum denke ich, dass dies immer eine Frage der Erfahrung ist.
sodele. damit ic auch am we was machen kann, habe ich mir firebird installed und wollte jetzt mal die 3 tabellen in eine db importieren. ich habe sie in csv exportiert und will sie nun importen. allerdings: so habe ich nur die spalten und die datensätze. dürften die abfrageversuche auch ohne data dictionary bzw ohne constaints und dergleichen funktioneiren? ich meine, wir machen ja eigentlich bisher nix, wo die einfluss nehmen würden?
der thread ist schon etwas älter, aber ich halte es für sinnvoll, abschließend noch kurz festzustellen:
osbes, deine abfragen sind korrekt (welch wunder^^). das hauptprob bestand darin (wie vermutet), dass die software nur sehr beschränkte abfragen zuließ. jetzt habe ich den sql manager lite 2008 im einsatz und arbeite mit kopien der db und alles löppt wie man es sich vorstellt
wehrmutstropfen: wir werden wohl jetzt die abfragen immer über den sql-manager laufen lassen müssen. somit kann nur ich die daten ziehen. najo, so macht man sich auch unkündbar^^