Dengue: MySQL 4.0.18

Hallo,
leider bin ich gezwungen mit einer MySQL-Version < 4.1 zu arbeiten. Deshalb sind die nützlichen Unterabfragen (z.B. in Where-Klauseln) nicht möglich. Man kann zwar Abfragen wie IN oder NOT IN durch JOINS ersetzen, aber ich habe hier eine komplexere Where-Klausel, bei der ich das nicht schaffe:

SELECT *  
FROM System AS sys  
JOIN System_Standort AS sysSta ON(sys.System_Standort_ID = sysSta.ID)  
WHERE  
  sys.ID NOT IN(SELECT Partner_ID FROM Konfiguration)  
  OR  
  (sys.ID IN(SELECT Partner_ID FROM Konfiguration) AND (sysSta.Standort_Dienststelle_ID = 0 OR sysSta.Standort_Dienststelle_ID IS NULL))

Hat jemand dazu eine Idee?

MfG
Dengue

  1. Hello,

    sys.ID NOT IN(SELECT Partner_ID FROM Konfiguration)
      OR
      (sys.ID IN(SELECT Partner_ID FROM Konfiguration) AND (sysSta.Standort_Dienststelle_ID = 0 OR sysSta.Standort_Dienststelle_ID IS NULL))[/code]

    verwende zunächst einen LEFT JOIN (solltest du noch nicht mit mehreren Tabellen gearbeitet haben, siehe Fortgeschrittene Jointechniken). um zusätzlich in die Konfigurationstabelle zu joinen. Der LEFT JOIN ermöglicht dir hinterher zu schauen, ob du tatsächlich einen Treffer in der Konfigurationstabelle hast oder nicht, und zwar erkennst du dies daran, dass die entsprechenden Felder NULL sind.
    Dementsprechend kannst du deine WHERE-Klausel nun anpassen:

      
    konf.Partner_ID IS NULL -- entspricht nach dem Join dem ersten Teil deiner Klausel  
    OR  
    (konf.Partner_ID IS NOT NULL AND ...)  
      
    
    

    sys

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. konf.Partner_ID IS NULL -- entspricht nach dem Join dem ersten Teil deiner Klausel
      OR
      (konf.Partner_ID IS NOT NULL AND ...)

        
      Vielen Dank. An die Sache mit dem IS NOT NULL habe ich gar nicht gedacht ;-) Bin halt noch müde.  
        
      MfG  
      Dengue
      
      1. yo,

        ganz so trivial ist es leider nicht, einfach JOINS daraus zu machen und auf null werte zu achten. durch JOINS kann sich die anzahl der datensätze verändern, die man in der ergebnismenge zurück bekommt. unterabfragen in der WHERE klausel grenzen weiter ein, verändern aber die anzahl der datensätze nicht. mit einem JOIN einzuschränken kann aber sehr wohl diese anzahl verändern, kommt immer auf den kokreten fall drauf an.

        des weiteren vermute ich ein logik-fehler in deiner abfrage, bedenke das AND stärker als das OR bindet, explizit bei dir in der zweiten unterabfrage.

        Ilja