Announcement

Collapse
No announcement yet.

Hilfe bei Abfrage Vegleich von Zeilen

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

  • Hilfe bei Abfrage Vegleich von Zeilen

    Ich brauche Hilfe bei einer SQL abfrage.

    Ich möchte im Ergebnis diejenigen SID ausgeben, bei der sich in Abhängigkeit zur MID die Einträge in AID unterscheiden.
    Also z.B. MID 01 der SID 13044 soll in AID die gleichen 1 bis n Einträge haben als MID 44 der SID 13044, in diesem Fall würde
    13044 und 13063 herauskommen, da es bei diesen IDs Unterschiede in der Spalte AID gibt.
    Ich habe es schon mit Group By und Unterabfragen versucht, komme aber auch mit Hilfe nicht auf eine Lösung. Ich wäre über eine konkrete Hilfe dankbar!

    ID SID MID AUID AID
    1 13044 01 05 AC
    2 13044 01 05 GP
    3 13044 44 05 AC
    4 13044 44 05 GP
    5 13044 45 05 MH
    6 13044 45 05 AC
    7 13063 01 06 AC
    8 13063 01 06 GP
    9 13063 44 06 AC
    10 13063 44 06 GP
    11 13063 45 06 MH
    12 13063 45 06 AC
    13 15110 01 06 LM
    14 15110 01 06 MG
    15 15110 01 06 ZO
    16 15110 01 06 TH
    17 15110 44 06 LM
    18 15110 44 06 MG
    19 15110 44 06 ZO
    20 15110 44 06 TH

    Also mich interessiert nur die SID bei der sich die Werte der Menge AID zwischen den Gruppen (MID) unterscheiden

    Habt Ihr eine Idee?
    Zuletzt editiert von Steffi2409; 16.11.2016, 09:39.

  • #2
    Welche Kombinationen von MID sollen durchlaufen werden?
    Alle, nur 2, .. ?
    Gruß, defo

    Comment


    • #3
      Wenn ihr deine Frage richtig verstanden habe alle.
      MiD ist eine Art Gruppenzugehörigkeit. Es gibt n verschiedene Gruppen. Wenn es aber nicht einfach geht könnte ich es einschränken, da wir aktuell nur 8 Gruppen(01,44,etc) verwenden.
      Zuletzt editiert von Steffi2409; 16.11.2016, 09:24.

      Comment


      • #4
        ok, welche DB habt Ihr?
        Geht es um bestimmte Verfahren (Schule, Uni) oder ist das für die Arbeit?
        Gruß, defo

        Comment


        • #5
          egal, ich habe nach Verfahren gefragt, weil in der Schule/Uni gern bestimmte Verfahren gewollt / abgefragt werden.
          Diese "Aufgabe" finde ich recht eigenartig, wahrscheinlich kein Schulstoff.
          Das Verfahren, was ich verwende nutzt keine Groups oder Window Functions, es bläht die Daten zwischendurch etwas auf und ist daher trotz kleiner Ergebnismenge nicht unbedingt schnell bzw. für große Mengen nicht gut geeignet. Jedenfalls ist es ohne proprietäre SQL Technik und von daher ist auch weitgehend egal, welche DB.

          Ich bin mir ehrlich gesagt nicht mal sicher, ob ich die Aufgabe richtig verstanden habe und ob meine Lösung tatsächlich alle Anforderungen abdeckt. Das musst Du genau prüfen.

          Im Prinzip habe ich damit begonnen, die Daten zu zerlegen und permutiert zusammenzusetzen:
          [highlight=sql]
          select *
          from (select distinct sid from atable) s,
          (select distinct mid from atable) m,
          (select distinct aid from atable) a
          [/highlight]

          Diese Menge habe ich dann gegen Deine Daten gejoint und die Permutation (oben) verbessert, also ausgedünnt.
          Ergebnis:
          [highlight=sql]
          select distinct sid
          from (select x.sid, s.sid as empty_id
          from (select s.*, m.mid
          from (select distinct sid, aid from atable) s
          join (select distinct sid, mid from atable) m
          on s.sid = m.sid) x
          left join (select sid, mid, aid from atable) s
          on x.sid = s.sid
          and x.mid = s.mid
          and x.aid = s.aid) y
          where empty_id is null
          [/highlight]
          Ob es das ist, was Du brauchst, musst Du Dir genau ansehen.
          Gruß, defo

          Comment


          • #6
            Das Datenmodell ist in der Tat etwas gewöhnungsbedürftig:-) Die Einträge syncronisieren sich normalerweiße per Programm, fällt die mal Sync aus, gibt es diese Probleme.
            Ich habe es für dieses Beispiel auch stark vereinfacht dargestellt.

            Deine Abfrage ist fast schon perfekt, Danke erst mal!!!
            Ich hatte aber eine Sache vergessen zu erwähnen:
            Es gibt noch eine Abhängigkeit zu AUID.

            Wenn es Unterschiede gibt, aber die AUID eine andere ist, darf es nicht in der Ergebnismenge auftauchen.

            Ich denke, dass man dazu dann auf jeden Fall in der Ergebnismenge die SID mit der AUID angehängt anzeigen lassen muss, um die beiden überhaupt zu unterscheiden.(Die haben rein logisch nichts miteinander zu tun, außer dass sie eine übergeordnente SID haben.


            ID SID MID AUID AID
            1 13044 01 05 AC
            2 13044 01 05 GP
            3 13044 44 06 FF
            4 13044 44 06 GP

            In diesem Fall darf es also nicht matchen!

            Hast Du noch eine Idee, wie man das hinbekommt?

            Ich würde jetzt einfach die AUID an die SID anhängen, aber vielleicht geht es ja eleganter.

            Comment


            • #7
              Schön! Die AUID hatte mich auch irritiert, aber ich hab letztlich vergessen nachzufragen oder mich entschieden, dass sie hier nicht relevant ist.
              Wenn doch und wenn letztlich nur die Nennung der SID gefragt ist, sollte eine ungültige AUID Konstellation doch im Kernselect gefiltert werden oder? Und an der Ausgabe (Felder) würde sich nichts ändern, nur an den zurückgegebenen Werten.
              Noch mal so nebenbei
              Welche DB ist das?
              Und ich finde das Problem ganz interessant und habe mich gefragt, ob es einen Namen hat?

              P.S.:
              Gibt es vielleicht doch Abhängigkeiten zwischen AUID und den anderen Spalten? Immerhin ist in dem neuen Beispiel zwar eine geänderte AUID im Spiel, das aber "synchron" zur MID.
              Wenn das Modell nicht gut normalisiert ist, wäre insgesamt die Frage, welche Kombis überhaupt insgesamt auftreten können und wie die dann hier im Problem aufzuteilen sind.
              Zuletzt editiert von defo; 17.11.2016, 12:14.
              Gruß, defo

              Comment


              • #8
                Ich hatte die ID nur der einfachhalber zerlegt, da ich dachte, man könnte dann besser vergleichen. Normalerweiße besteht die ID, die zurückgegeben werden soll aus SID+MID+AUID.
                Also bestenfalls hat man im Ergebnis die komplette ID(SID+MID+AUID).

                Comment


                • #9
                  Mir ist nun nicht ganz klar, welche Gruppen matchen und welche nicht. Andere AUID bildet eigenständige Menge, egal welche MID?
                  Versuch es doch einfach selbst, die AUID entsprechend der Bedingungen noch mit zu berücksichtigen.
                  Erweitere das innere Select so mit AUID, dass im Left Join mit der Gesamtmenge da Lücken bleiben, wo die SID ausgegeben werden soll.
                  In diesem Zwischenschritt kann man das ganz gut sehen (Äußeres Select weggelassen, Spalten alle ausgegen), wie die Mengen aussehen:
                  [highlight=sql]
                  SELECT x.*, s.* AS empty_id
                  FROM (SELECT s.*, m.mid
                  FROM (SELECT DISTINCT sid, aid FROM atable) s
                  JOIN (SELECT DISTINCT sid, mid FROM atable) m
                  ON s.sid = m.sid) x
                  LEFT JOIN (SELECT sid, mid, aid FROM atable) s
                  ON x.sid = s.sid
                  AND x.mid = s.mid
                  AND x.aid = s.aid
                  [/highlight]
                  Gruß, defo

                  Comment

                  Working...
                  X