+ Antworten
Seite 3 von 3 ErsteErste 123
Ergebnis 41 bis 47 von 47

sql: "having klausel" ersetzen

Eine Diskussion über sql: "having klausel" ersetzen im Forum Hausaufgaben. Teil des OFF-Topic-Bereichs; Ok, ich nehme an, dass es jetzt läuft?...

  1. #41
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.303
    Ok, ich nehme an, dass es jetzt läuft?

  2. #42
    Hauptfeldwebel
    Avatar von Wilma
    Registriert seit
    02.02.2007
    Ort
    Ruhrpott
    Alter
    35
    Beiträge
    3.329
    Name
    Michael
    Nick
    dp.Mordred
    Clans
    dp.
    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,
    	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
    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,
    	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
    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
    www.die-philosoffen.com
    Wir zocken [ZH] [SC2] [EVE] [BF:BC2]
    Mindestalter: 21 Jahre

  3. #43
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.303
    Zitat Zitat von Wilma Beitrag anzeigen
    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.

    Zitat Zitat von Wilma Beitrag anzeigen
    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

  4. #44
    Hauptfeldwebel
    Avatar von Wilma
    Registriert seit
    02.02.2007
    Ort
    Ruhrpott
    Alter
    35
    Beiträge
    3.329
    Name
    Michael
    Nick
    dp.Mordred
    Clans
    dp.
    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 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?
    www.die-philosoffen.com
    Wir zocken [ZH] [SC2] [EVE] [BF:BC2]
    Mindestalter: 21 Jahre

  5. #45
    Administrator
    Avatar von Osbes
    Registriert seit
    24.10.2003
    Beiträge
    11.303
    Zitat Zitat von Wilma Beitrag anzeigen
    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.

  6. #46
    Hauptfeldwebel
    Avatar von Wilma
    Registriert seit
    02.02.2007
    Ort
    Ruhrpott
    Alter
    35
    Beiträge
    3.329
    Name
    Michael
    Nick
    dp.Mordred
    Clans
    dp.
    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?
    www.die-philosoffen.com
    Wir zocken [ZH] [SC2] [EVE] [BF:BC2]
    Mindestalter: 21 Jahre

  7. #47
    Hauptfeldwebel
    Avatar von Wilma
    Registriert seit
    02.02.2007
    Ort
    Ruhrpott
    Alter
    35
    Beiträge
    3.329
    Name
    Michael
    Nick
    dp.Mordred
    Clans
    dp.
    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^^
    www.die-philosoffen.com
    Wir zocken [ZH] [SC2] [EVE] [BF:BC2]
    Mindestalter: 21 Jahre

+ Antworten
Seite 3 von 3 ErsteErste 123

Ähnliche Themen

  1. TOP 100 """[NAKELS]""" DC | nice replay
    Von metri im Forum Fairplay
    Antworten: 4
    Letzter Beitrag: 24.05.2009, 18:34
  2. Antworten: 21
    Letzter Beitrag: 27.03.2009, 03:22
  3. Antworten: 8
    Letzter Beitrag: 19.04.2005, 13:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •