Announcement

Collapse
No announcement yet.

Komplizierte Abfrage?

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

  • Komplizierte Abfrage?

    Hi,
    wer kann bei folgendem Problem helfen:

    Gegeben sind 4 Tabellen: A, B, C und D

    A: ID INTEGER PRIMARY KEY, INFO VARCHAR(20)
    B: A_ID INTEGER, C_ID INTEGER
    C: ID INTEGER PRIMARY KEY, EIGENSCHAFT VARCHAR(20)
    D: C_ID INTEGER PRIMARY KEY

    Werte aus C können nun über die Tabelle B mit A Verknüpft werden.
    Also klassisch. D enthält beispielsweise eine Untermenge von C.
    C ist nur zum besseren Verständnis aufgeführt wird aber nicht bei der Abfrage benötigt.

    Ich benötige nun eine Abfrage die mir alle A liefert deren Datensätze durch B.A_ID referenziert werden welche genau <b>alle</b> B.CID = D.C_ID enthält.

    Also von allen Sätzen in D die von den Werten und der Anzahl der Sätze mit B übereinstimmen möchte ich A erhalten.

    Bah ist das kompliziert...

    Danke für die Hilfe!

  • #2
    Jaja, is wohl doch zu schwer..

    Comment


    • #3
      nein, nein, bin mir nur nicht sicher ob es überhaipt geht und ob man da nicht lieber über den DB Entwurf nachdenkt, denn sowas ist mir noch nicht untergekommem.

      Um was für Daten geht es denn tatsächlich, statt A,B,C,D.

      Kannst Du eine Stored Procedure einsetzen? Plattform InterBase ?

      p.s. Wenn Du Deinen Namen angibst, antworten vielleicht auch mehr Leute

      Comment


      • #4
        versuchs mal mit:

        SELECT A.* FROM (B INNER JOIN D ON B.C_ID = D.C_ID) LEFT JOIN A ON B.A_ID = A.ID

        Comment


        • #5
          Hallo!

          Erstmal stelle ich mich mal kurz vor:

          Frank Bäurle
          Geschäftsführer der bäurle informatik GmbH und IPC von Borland.

          Ab und zu hab ich mal eine dumme Frage und diesmal habe ich Sie hier gestellt. Selbstredend das ich künftig auch hier Fragen beantworte - falls mir keiner zuvorkommt!

          Es ist IB und selbstverständlich verwende ich´eine SP.
          Um das Problem mal transparenter zu machen:
          Im Beispiel geht es um die Verwaltung von Teddybären.
          Tabelle A enthält jeden Teddybären den es gibt mmit seiner individuellen Seriennummer. Jeder ist in seinen Eigenschaften. z.B. Fellfarbe und beschaffenheit, Augenfarbe, Gewicht, Schuhgrösse etc. beschrieben.

          Diese Beschreibung der Eigenschaften ist durch Tabelle B repräsentiert welche die Verknüpfungen zu Tabelle C hält.
          Tabelle C enthält alle möglichen Eigenschaften (jede Eigenschaft ist eindeutig).

          Nun sucht jemand eine Teddy der bestimmte Eigenschaften (1 oder n)besitzen muss:
          Beispiel: Fellfarbe braun, Schuhgrösse 14.

          Die Abfrage soll nun die Teddys aus A liefern welche in B mindestens mit den Muss-Eigenschaften zu C verknüpft sind. Ist eine Muss Eigenschaft nicht enthalten, so wird der Teddy auch nicht angezeigt.

          Ich hoffe das es so verständlicher ist.

          MfG
          Frank

          P.S. ich Antworte deswegen so spät weil ich meinen einwöchigen Jahresurlab nahm...

          Comment


          • #6
            Irgendwas haut nicht hin bzw. ich versteh es nicht

            Tabelle A
            (1, Teddy1)
            (2, Teddy2)

            Tabelle C
            (101, 'Fellfarbe')
            (102, 'Schuhgroesse')

            Tabelle B
            (1,101,'braun');
            (1,102,'47');

            oder wie oder was und was ist dann eine Musseigenschaft

            Comment


            • #7
              Tabelle A

              1 Teddy1
              2 Teddy2

              Tabelle B
              A_ID C_ID
              1 1
              1 4
              1 7
              2 1
              2 5

              Tabelle C
              1 Schuhgrösse 14
              2 Schuhgrösse 15
              3 Schuhgrösse 16
              4 Braunes Fell
              5 Schwarzes Fell
              6 Blaue Augen
              7 Stummelschwanz

              Bei: Gib mir alle Teddys mit "Schuhgrösse 14" und "Scharzem Fell"
              darf nur Teddy2 zurückkommen.
              Soweit ganz einfach. Jetzt kann es aber sein dass so ein Teddy über 500 verschiedene Eigenschaften haben kann und irgendwer sucht einen Teddy der 48 bestimmte Eigenschaften besitzen muss. Das Manuelle zusammenbauen der Abfrage mit AND xx AND scheidet aus weil das Statement für den PLAN zu lang wird. Also schreibe ich die Eigenschaften in eine Tabelle D und will nun mit einer SP die Teddys mit den Muss Eigenschaften finden.

              Das ganze wird noch einen Zacken schärfer, denn es kommen noch KANN- Eigenschaften dazu und dann ein Rating mit wieviel Prozent die Übereinstimmung unter Bezug auf die Kann-Eigenschaften ist.
              Aber dazu vielleicht später mehr.

              Die Antwort von Michael Peter (Danke übrigens)
              SELECT A.* FROM (B INNER JOIN D ON B.C_ID = D.C_ID) LEFT JOIN A ON B.A_ID = A.ID;

              ist schon nah dran. Derzeit gibt es noch einen "Column does not belong to referenced table." Fehler.

              Gruss Fran

              Comment


              • #8
                Tabelle A: (1, Teddy1) (2, Teddy2)

                Tabelle B: (A_ID; C_ID) (1,1) (1,4) (1,7), (2,1), (2,5)

                Tabelle C: (1, Schuhgrösse 14) (2, Schuhgrösse 15) (3, Schuhgrösse 16) (4, Braunes Fell) (5, Schwarzes Fell) (6, Blaue Augen) (7, Stummelschwanz)

                Bei: Gib mir alle Teddys mit "Schuhgrösse 14" und "Scharzem Fell" darf nur Teddy2 zurückkommen. Soweit ganz einfach. Jetzt kann es aber sein dass so ein Teddy über 500 verschiedene Eigenschaften haben kann und irgendwer sucht einen Teddy der 48 bestimmte Eigenschaften besitzen muss. Das Manuelle zusammenbauen der Abfrage mit AND xx AND scheidet aus weil das Statement für den PLAN zu lang wird. Also schreibe ich die Eigenschaften in eine Tabelle D und will nun mit einer SP die Teddys mit den Muss Eigenschaften finden.

                Das ganze wird noch einen Zacken schärfer, denn es kommen noch KANN- Eigenschaften dazu und dann ein Rating mit wieviel Prozent die Übereinstimmung unter Bezug auf die Kann-Eigenschaften ist. Aber dazu vielleicht später mehr.

                Die Antwort von Michael Peter (Danke übrigens) SELECT A.* FROM (B INNER JOIN D ON B.C_ID = D.C_ID) LEFT JOIN A ON B.A_ID = A.ID;

                ist schon nah dran. Derzeit gibt es noch einen "Column does not belong to referenced table." Fehler.

                Gruss Fran

                Comment


                • #9
                  Ich denke mal laut:

                  Erst recht wenn Du auch noch Teilübereinstimmungen detektieren willst, brauchst Du eine Tabelle mehr. Mache aus C

                  C1 mit den möglichen Eigenschaften (Schuhgrösse, Fellfarbe etc)
                  und C2 mit den Eigenschaftswerte wobei du die Werte einer Eigenschaft zuordnest C2(c2_id, c1_id, wert).

                  Sonst kannst Du deine Eigenschaften nicht strukturieren.

                  Löst aber unser derzeitiges Problem nicht wirklich, weil der Teddy in Tabelle B jetzt auf C2 referenziert und wir das gleiche Problem nach wie vor haben.

                  Wie wäre es denn mit einer Stored Procedure (ungetestet aus dem Kopf):
                  <pre>
                  create procedure gibMirDenTeddy()
                  returns (aid integer, data ..)
                  as
                  declare variable cnt integer;
                  begin
                  /*wieviel sätze sind in D */
                  select count(*) from d into :cnt;
                  /* joine d mit B und schaue wer gleichviel sätze hat */
                  /* das sind die die wir brauchen */
                  for select a_id from b join d on b.c_id=d.c_id
                  group by a_id having count(*) = :cnt
                  into :aid do
                  begin
                  select data from a where a_id=:aid into :data;
                  suspend;
                  end
                  end^

                  select * from gibMirDenTeddy^
                  </pre>

                  Ist es das? Habe es nicht ausprobiert. Daraus läßt sich jetzt auch ein geschlossenes Statement ableiten, mit nested select und so, das ist aber vermutlich deutlich langsammer

                  Comment

                  Working...
                  X