Announcement

Collapse
No announcement yet.

Falsche Einträge finden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Falsche Einträge finden

    Hallo zusammen,

    ich stehe heute irgendwie auf dem Schlauch.
    Ich habe zwei Tabellen in einer vorhandenen Struktur bei denen ich in der einen Tabelle Einträge finden muss die da nicht drin sein dürfen.

    Ich versuche mal die Tabellen einfach zu halten:
    T1: GRUPPE,HOST,NAME,RECHTE
    T2: GRUPPE,NAME,HOST

    Erklärung zu T2:
    In dieser Tabelle werden die einzelnen Namen den Gruppen zugewiesen. Wenn der Eintrag HOST leer ist, dann darf der NAME bei allen HOSTS der Gruppe in T1 verwendet werden, wenn dort ein Host eingetragen wurde, dann darf der Name nur auf diesem HOST in T1 verwendet werden.

    T1:
    1,SYSTEM1,WILLI1
    1,SYSTEM2,WILLI1
    1,SYSTEM1,WILLI2
    1,SYSTEM2,WILLI2
    1,SYSTEM1,WILLI4
    1,SYSTEM1,WILLI3

    T2:
    1,WILLI1,NULL
    1,WILLI2,SYSTEM1
    1,WILLI3,SYSTEM2
    1,WILLI4,NULL

    Falsch wären hier:
    1,SYSTEM2,WILLI2
    1,SYSTEM1,WILLI3

    Wie baue ich das SQL Kommando dafür zusammen, ich komme mit dem LEFT JOIN nicht weiter.
    Danke für eure Hilfe.

  • #2
    Originally posted by kandalf View Post
    Falsch wären hier:
    1,SYSTEM2,WILLI2
    1,SYSTEM1,WILLI3
    Ich hab das Problem nicht ganz verstanden. Beziehen sich die Angaben unter "Falsch wären hier" auf T2 oder T1?
    Sprich, das SQL soll falsche einträge in T2 oder T1 ausspucken?
    Gruß, defo

    Comment


    • #3
      Originally posted by defo View Post
      Ich hab das Problem nicht ganz verstanden. Beziehen sich die Angaben unter "Falsch wären hier" auf T2 oder T1?
      Sprich, das SQL soll falsche einträge in T2 oder T1 ausspucken?
      Ach so, entschuldigung. Es sollen die falschen Einträge in T1 gefunden werden die nicht erlaubt sind.
      T2 ist sowas wie eine Erlaubniszuweisung der NAMEN in die GRUPPEN

      WILLI3 auf SYSTEM1 in T1 ist nicht erlaubt, weil der NAME WILLI3 in T2 expliziet nur für SYSTEM2 zugelassen wurde.

      Comment


      • #4
        so irgendwie (mit Oracle)
        [HIGHLIGHT=SQL]
        select t1.*
        from T1, (Select distinct Gruppe from t2) t2
        where t1.Gruppe = t2.gruppe
        and (t1.Name, t1.Host) not in
        (Select Distinct t2.name, x.host
        from T2, (Select Distinct Host from t2 where Host <> 'NULL') x
        where decode(t2.host, 'NULL', x.HOST, t2.host) = x.HOST)
        [/HIGHLIGHT]

        Zeige alle T1, deren Werte nicht in der Permutierten erlaubten Menge liegen.
        Gruß, defo

        Comment


        • #5
          Ok, muss ich mal ausprobieren, ich vermute aber mal dass das mit dem decode die SQLite nicht kann.
          Zuletzt editiert von kandalf; 04.12.2012, 12:07.

          Comment


          • #6
            Originally posted by kandalf View Post
            Ok, muss ich mal ausprobieren, ich vermute aber mal dass das mit dem decode die SQLite nicht kann.
            Da müsste es mit case when gehen.
            Bin mir aber nicht sicher, ob sqLite die mehrspaltigen (..) IN (select..) abbildet.
            Gruß, defo

            Comment


            • #7
              Ich glaube das geht nicht mit SQLite. Der meckert an so einigen Stellen die undefiniert sind im Editor.

              Comment


              • #8
                Tja, dann muss man sich fragen, ob man das Prinzip des Statements behält und sqLite tauglich macht oder ein ganz anderes Verfahren wählt.
                Z.B. ist die Permutation unter Verwendung von decode in erster Linie bequem, nicht unbedingt effzient.
                Das () not in (Select..) Konstruct könnte man wahrscheinlich durch Intercept/Except ersetzen.
                Gruß, defo

                Comment


                • #9
                  Ich hätte das SQL Statement einfach so gemacht

                  Code:
                  SELECT DISTINCT T1.*
                  FROM T1
                  LEFT OUTER JOIN T2 ON T1.GRUPPE = T2.GRUPPE AND T1.NAME = T2.NAME AND T1.HOST = T2.HOST
                  LEFT OUTER JOIN T2 AS T3 ON T1.GRUPPE = T3.GRUPPE AND T1.NAME = T3.NAME
                  WHERE COALESCE(T1.HOST, '') <> COALESCE(T2.HOST, T3.HOST)
                  Die DB2 mit der ich getestet habe lässt beim Join die Einträge mit HOST = NULL weg ich weiß nicht wie es der SQLite handhabt, evtl. muss die Where Bedingung noch um COALESCE(T2.HOST, T3.HOST) IS NOT NULL ergänzt werden.

                  Das Ergebnis ist in diesem Fall auf jeden Fall das gewünschte, zumindest so wie ich das Problem verstanden habe.

                  Die Einträge in denen der T2 Host ohnehin NULL ist müssen nicht geprüft werden, alle anderen werden verglichen, zur Sicherheit mit COALESCE() falls in der T1 der Hostname NULL ist - ich weiß ja nicht wie die Daten dann im Original aussehen.

                  Der Code funktioniert auch wenn in T2 ein Name in mehreren Hosts zulässig wäre.

                  Gruß Womble
                  Zuletzt editiert von Womble; 04.12.2012, 17:06.

                  Comment


                  • #10
                    Meine erste Version funktioniert nur wenn die NULL in der DB echte NULL Werte sind und nicht 'NULL' als Wort in der Spalte steht.
                    Der hier ist für den Fall das 'NULL' tatsächlich als Wort in der Spalte steht.

                    Code:
                    SELECT DISTINCT T1.*, COALESCE(T2.HOST, T3.HOST) AS HOST
                    FROM T1
                    LEFT OUTER JOIN T2 ON T1.GRUPPE = T2.GRUPPE AND T1.NAME = T2.NAME AND NULLIF(T1.HOST, 'NULL') = NULLIF(T2.HOST, 'NULL')
                    LEFT OUTER JOIN T2 AS T3 ON T1.GRUPPE = T3.GRUPPE AND T1.NAME = T3.NAME
                    WHERE COALESCE(NULLIF(T2.HOST, 'NULL'), NULLIF(T3.HOST, 'NULL')) IS NOT NULL AND COALESCE(NULLIF(T1.HOST, 'NULL'), '') <> COALESCE(NULLIF(T2.HOST, 'NULL'), NULLIF(T3.HOST, 'NULL'))
                    Gruß Womble

                    Comment

                    Working...
                    X