grosses problem mit kreuztabelle



  • hallo,
    ich muss für ein kunden eine Art von Berufsprofilen ausgeben und speichern.

    Dazu gibt es verschiedene Gruppen mit jeweils verschiedenen Werten. Um einigermassen flexibel zu sein, hab ich leider folgende Tabellen erstellt:

    * SL_STELLENLEXICON
    	SL_ID			SL_TITEL
    	21				'Leiter Engineering'
    	41				'Bauleiter'
    	42				'Lead Engineer'
    
    * SL_STELLENLEXICON_GRUPPEN
    	SLG_ID			SLG_NAME
    	51				'Funktion'
    	52				'Laufbahn'
    	53				'Softskills'
    
    * SLW_STELLENLEXICON_WERTE
    	SLW_ID			SLG_ID				SLW_WERT			
    	101				51					'Produktion'
    	102				51					'Einkauf/Logistik/Import'
    	103				52					'Führungslaufbahn'
    	104				52					'Fachlaufbahn'
    
    * SLZ_STELLENLEXICON_ZUWEISUNGEN
    	SLZ_ID			SLZ_SL_ID			SLZ_SLG_ID				SLZ_SLW_ID
    	1				21					52						103
    	1				21					52						104
    

    d.h. in der Tabelle "zuweisungen" stehen sämtliche wertezuweisungen für die einzelnen gruppen.

    Mein Problem ist nun, dass ich eine einschränkende Mehrfachauswahl erstellen sol, aber ich mit den Daten nicht zurechtkomme, denn ich
    bekomme die abfrage nicht so hin, dass ich alle Berufsprofile (SL_ID) ermittel,
    die als Funktion(SLG_ID=51) "Produktion" oder "Einkauf/Logistik/Import" haben UND!!!
    als Laufbahn (SLG_ID=52) 'Führungslaufbahn' und 'Fachlaufbahn' haben.#

    Problem ist die kombination aus und / oder bzw der tatsache, dass alle möglichen werte in einer tabelle stehen.

    z.zt sieht mein sql-Staement so aus:
    SELECT
    DISTINCT SL_ID
    FROM
    SLZ_STELLENLEXICON_ZUWEISUNGEN SLZ
    inner join SL_STELLENLEXICON SL ON SL.SL_ID = SLZ.SLZ_SL_ID
    inner join SLW_STELLENLEXICON_WERTE SLW ON SLW_ID = SLZ_SLW_ID
    inner join SLG_STELLENLEXICON_GRUPPEN ON SLG_ID = SLZ_SLG_ID

    WHERE ( LOWER(SL_TITEL) LIKE '%bauleiter%' OR LOWER(SLW_WERT) LIKE '%bauleiter%' )
    AND (
    (SLW_ID IN(156, 157) )
    AND (SLW_ID IN(325) )
    )

    aber die abfrage der SLW_ID funktioniert nicht, da logischerweise bei keinem Datensatz die SLW_ID 156 UND 325 sein kann

    jemand eine Idee wie ich das lösen kann?



  • rüddi schrieb:

    [..]

    aber die abfrage der SLW_ID funktioniert nicht, da logischerweise bei keinem Datensatz die SLW_ID 156 UND 325 sein kann

    jemand eine Idee wie ich das lösen kann?

    Ähem, ich habe mir dein Statement zwar nicht genau angesehen, aber wenn du Datensätze mit einer SLW_ID = 156 bzw.(aka oder!) SLW_ID = 325 abfragen willst/musst, dann musst du das mit "OR" machen!



  • genau das ist ja mein problem dabei, dass die abfragen immer mehr einschränken sollen.
    wenn ich diese mit oder verknüpfe, bekomme ich logischerweise immer mehr ergebnisse.
    habs nun erstmal mittels script gelöst.
    Die erste gruppe wird mittels sql-abgefragt, als ergebnis bekomme ich die passenden sl_id's (der einen gruppe).
    Beim SQL-Statement der nächsten gruppe werden die sl_id's mit einbezogen (... AND SL_ID in (....). und die zurückgegebenen sl_id's werden wieder der nächsten abfrage übergeben....

    somit brauche ich für jede gruppe (bei mir insg. 7) ein SQL-Aufruf.

    schöner wäre es mit einem



  • rüddi schrieb:

    schöner wäre es mit einem

    Du könntest ein Subselect einbauen.

    SELECT [bla] WHERE SLW_ID IN(156, 157) AND SLZ_ID IN (SELECT [bla] WHERE SLW_ID IN(325))



  • aber für die einzelnen subselect brauche ich die entsprechenden sl_id's die ich nur mittels zusätzlichen selects rausbekomme.
    also auch mind. 1 select pro gruppe



  • Dann mach doch mehrere OR

    WHERE (wasweiich = 3 OR wasaucimmer = 23) AND (kjhsdflkj)



  • _

    ... AND (
    (SLW_ID IN(156, 157) )
    AND (SLW_ID IN(325) )
    )

    funktioniert nicht wie bereits gesagt (1.post).
    aber danke euch. ich lass die einzelnen sql-aufrufe nun so stehen.

    einzige möglichkeit die mirt noch einfällt: ein einziges statement erstellen, in denen 7 anweisungen (pro gruppe eine) ineinander verschachtelt werden.
    sowas wie:
    select SL_ID from foobar where (SLW_ID IN(156, 157) AND SLG_ID=4) and SL_ID in (Select SL_ID from foobar where (SLW_ID IN(155) AND SLG_ID=2) and SL_ID in (...u.s.w -..)


Anmelden zum Antworten