sql: "having klausel" ersetzen

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.
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,
	[COLOR="Red"]einsPers.DatumVon AS DatumVon[/COLOR]
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
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 kann :?

meine eigenkreation:
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,
	[COLOR="Red"]einsPers.DatumVon AS DatumVon[/COLOR]
FROM
	[COLOR="Red"]personal
	INNER JOIN
		einsPers
		ON
		(
			einsPers.DatumVon = 
			(
				SELECT
					MAX(einsPers.DatumVon)[/COLOR]
				FROM
					einsPers,
					auftrag,
					[COLOR="Red"]personal[/COLOR]
				WHERE
						auftrag.auftstatus = 2
					AND personal.personalnr = einsPers.personalnr
					AND auftrag.auftragnr = einsPers.auftragnr
			)
		)
	
	INNER JOIN
		[COLOR="Red"]auftrag
		ON
			auftrag.auftragnr = einsPers.auftragnr[/COLOR]
WHERE
		personal.persstatus = 2
	OR 	personal.persstatus = 7
ORDER BY
	personal.nachname
	ASC
die DatumVon-Spalte beinhaltet nur noch den höchsten Wert, aber den gleichen für jeden ma.
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 :(
 
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 kann :?
Dies liegt daran, das die Tabelle "einsPers"
nur über die Bedingung
Code:
personal.personalnr = einsPers.personalnr
Verknüpft wurde, diese passt jedoch zu jedem Auftrag.

die DatumVon-Spalte beinhaltet nur noch den höchsten Wert, aber den gleichen für jeden ma.
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
 
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
					[COLOR="Red"]AND personal.personalnr = einsPers.personalnr[/COLOR]
					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 nicht :?
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?
 
aber ohne personal bekommt er die spalte doch nicht :?

Doch, denn die Verbindung zur personal Tabelle wird schon aßerhalb des INNER JOIN erstellt und zwar mit
Code:
FROM
	personal
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.

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 :top
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^^
 
Back
Top Bottom