Announcement

Collapse
No announcement yet.

Abfrage gesucht...

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

  • Abfrage gesucht...

    Hi hallo,

    ich hab mal wieder ne Frage :-)

    Ich möchte eine Abfrage erstellen die zu einer ID aus einer Tabelle (TAB1) eine zufällig ausgewählte ID (unter bestimmten Voraussetzungen) aus einer anderen Tabelle (Tab2) zuordnet. Soweit noch kein Problem.

    Doch im Laufe der Abfrage sollen nur ID´s aus Tab2 zu ID´s aus Tab1 zugeordnet werden die BISHER (während die Abfrage läuft) noch nicht in der neuen Tab enthalten sind.

    Hier meine Query bisher (die nicht so funktioniert):

    CREATE TABLE Tab3
    SELECT
    (SELECT s.ID
    FROM Tab2 s
    WHERE s.ID NOT IN ((SELECT apn_id FROM Tab1) AND (SELECT refID FROM Tab3))
    ORDER BY rand(10)
    LIMIT 1) refID
    FROM Tab1;

    Der unterstrichende Teil macht mir Probleme - wie kann ich in einer laufenden Abfrage sicherstellen, dass nur neue ID´s hinzugenommen werden die NOCH NICHT in der neuen Tabelle vorhanden sind.

    War das verständlich???

    Grüße & vielen Dank!
    Alex

  • #2
    Hallo,
    Originally posted by Alexander_ View Post
    ...wie kann ich in einer laufenden Abfrage sicherstellen, dass nur neue ID´s hinzugenommen werden die NOCH NICHT in der neuen Tabelle vorhanden sind.

    War das verständlich???
    Nein, nicht wirklich.
    Originally posted by Alexander_ View Post
    ...
    NOT IN ((SELECT apn_id FROM Tab1) AND (SELECT refID FROM Tab3))
    Das ist syntaktischer Unsinn! Wenn, dann müßte das so heißen:
    [highlight=sql]
    ...
    NOT IN (
    SELECT apn_id FROM Tab1)
    AND NOT IN (
    SELECT refID FROM Tab3)
    [/highlight]
    Im Zusammenhang mit einem CREATE TABLE AS SELECT ist es jedoch auch logischer Unsinn. Da die Tabelle gerade erstellt wird (CREATE), kann auf sie auch noch nicht zugegriffen werden, geschweige denn das sie Daten enthält.

    Deshalb das obige Nein, da mir nicht ganz klar ist was du bezweckst.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      Im Zusammenhang mit einem CREATE TABLE AS SELECT ist es jedoch auch logischer Unsinn. Da die Tabelle gerade erstellt wird (CREATE), kann auf sie auch noch nicht zugegriffen werden, geschweige denn das sie Daten enthält.
      ... genau das ist das Problem ... ich hab auch den syntaktischen Fehler behoben und bekomme dann immer den Fehler #1093 - (Verwendung der sich aktualisierende Zieltabelle ist in einer FROM-Klausel nicht zulässig)

      Aber genau das brauche ich!!
      Ich möchte im Prinzip sicherstellen, dass nur neue Datensätze aus einer Tab2 geholt werden die bisher noch nicht (bis zum jetzigen Zeitpunkt in der Anfrage) aus dieser Tab2 geholt wurden. Also an sich müßte meiner Meinung nach die Tabelle auf sich selber zugreifen ...

      Ist das verständlicher?
      Kann man das irgendwie anders verwirklichen?

      Viele Grüße
      Alex

      Comment


      • #4
        Hi,

        ich nochmal ...

        ein kleines Bsp um es zu verdeutlichen:
        ID ist die Augangsid aus Tab1 - die refID wird nun aus Tab2 geholt:

        Tab3

        ID - refID
        1 - 5
        2 - 7
        3 - 2
        4 - 9
        5 - 7 <----- Fehler ... da 7 schon als refID aus Tab2 geholt wurde!!!! stattdessen muß eine refID genommen werden die noch nicht in der sich aufbauenden Tabelle vorhanden ist! Hier also alle außer 2,5,7,9 ...

        Wie kann ich das sicherstellen???

        Grüße
        Alex

        Comment


        • #5
          Hallo,
          Originally posted by Alexander_ View Post
          ...Wie kann ich das sicherstellen???
          indem du die Basis also die SELECT-Abfrage so formulierst das sie eindeutige Werte liefert. (z.B. über ein Distinct)

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hi Falk,

            also hab es mal mit DISTINCT versucht - klappt aber (zumindest so) nicht:

            CREATE TABLE Tab3
            SELECT
            (SELECT DISTINCT s.ID
            FROM Tab2 s
            WHERE s.ID NOT IN (SELECT apn_id FROM Tab1)
            ORDER BY rand(10)
            LIMIT 1) refID
            FROM Tab1;

            Da bekomme ich genau das gleiche Ergebnis wie davor ... Oder meinstest du das anders?

            Grüße
            Alex

            Comment


            • #7
              Hallo Alex,

              mir ist nachwievor nicht ganz klar, was du bezweckst.

              In der Select-Anweisung für dein Create-Statement hast du ein LIMIT 1 drin, damit wird die Tabelle immer mit genau EINEM Datensatz gefüllt - Logisch das da ein Distinct keine Veränderung bringt.
              Du willst eine Tabelle erstellen und gleichzeitig mit Werten befüllen, die "BISHER (während die Abfrage läuft) noch nicht in der neuen Tab enthalten sind. ". Du fügst jedoch nur EINEN Datensatz ein (wg. LIMIT 1). Also entweder hast du einen grundsätzlichen Denkfehler oder wir reden aneinander vorbei.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Das Problem ist doch, dass er die Tabelle die er updaten möchte nicht im Subselect verwenden kann.
                Du könntest mal versuchen eine View auf die Tabelle anzulegen und diese dann im Subselect zu verwenden Ist zwar nicht wirklich schön, aber es sollte funktionieren.

                Comment


                • #9
                  Hallo,
                  Originally posted by fanderlf View Post
                  Das Problem ist doch, dass er die Tabelle die er updaten möchte nicht im Subselect verwenden kann.
                  Genau, weil es um ein Create-Statement geht und dort kann man in keinem mir bekannten DBMS auf die gerade erstellte Tabelle zugreifen.
                  Originally posted by fanderlf View Post
                  ...Du könntest mal versuchen eine View auf die Tabelle anzulegen und diese dann im Subselect zu verwenden Ist zwar nicht wirklich schön, aber es sollte funktionieren.
                  Na dann versuch mal auf eine nicht existente Tabelle eine View anzulegen... Da kenn ich auch kein DBMS bei dem das möglich ist.

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    Hi,

                    ja genau was fanderlf sagte ist mein Problem und funktioniert so nicht...

                    Das limit 1 kommt daher, dass ich aus einer größeren Tab2 zu jedem einzelnen Datensatz aus einer kleineren Tab1 genau EINEN EINZIGEN zufällig ausgewählten Datensatz holen möchte der in Tab3 geschrieben wird.

                    Dabei soll aber sicher gestellt werden, dass nicht 2 mal der gleiche Datensatz zufällig aus Tab2 geholt wird. Und genau das ist mein Problem, dass zu bewerkstelligen.

                    Zur Erklärung:
                    Was für einen Datensatz ich jetzt aus Tab2 zu dem jeweiligen Datensatz in Tab1 hole wird überprüft u.a. durch gleiches Anmeldejahr, gleiches Geburtsland etc ...
                    Es geht darum eine gleich aufgebaute Kontrollgruppe aufzubauen für statistische Auswertungen.

                    Comment


                    • #11
                      Vlt. hab ich ja eine lange Leitung aber
                      Originally posted by Alexander_ View Post
                      ...dass ich aus einer größeren Tab2 zu jedem einzelnen Datensatz aus einer kleineren Tab1 genau EINEN EINZIGEN zufällig ausgewählten Datensatz holen möchte der in Tab3 geschrieben wird.

                      Dabei soll aber sicher gestellt werden, dass nicht 2 mal der gleiche Datensatz zufällig aus Tab2 geholt wird.
                      Ist für mich in sich widersprüchlich wieso mußt du Eindeutigkeit sicherstellen wenn eh nur EIN EINZIGER Datensatz ausgewählt werden soll .
                      Du erstellst eine Tabelle mit einem einzigen Datensatz und eine Tabelle kann nur EINMAL erstellt werden. Wie passt hier bitte: "dass nicht 2 mal der gleiche Datensatz zufällig aus Tab2 geholt wird"

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hi,

                        ja aber ich wähle einen einzigen Datensatz aus Tab2 für JEDEN vorkommenden Datensatz in Tab1 aus und nicht absolut.

                        Ein Bsp.:
                        Ich habe Tab1 mit 1.000 Datensätzen und Tab2 mit 1.000.000 Datensätzen - jeweils mit ID, Anmeldejahr, Geburtsort und weiterer Daten ...
                        Dann möchte ich jetzt eine Tab3 erstellen mit genau 1.000 Datensätzen die aus Tab2 kommen, die jeweils das gleiche Anmeldejahr und gleichen Geburtsort wie die Datensätze in Tab1 besitzen.
                        Ich will also für jeden Datensatz in Tab1 ein 'Beispieldatensatz' aus Tab2 haben. Gibt es jetzt in Tab1 mehrmals die gleiche Kombination von Anmeldejahr und Geburtsort - dann könnte theoretisch auch zufällig der gleiche Datensatz NOCH EINMAL aus Tab2 ausgewählt werden - und genau das darf nicht passieren. Die 'Beispieldatensätze' müssen einzigartig sein!

                        Besser zu verstehen?


                        Hab das mal mit einem VIEW versucht (theoretisch ja ganz logisch) ... also mit CREATE OR REPLACE VIEW ...
                        Aber komme da mit der Syntax nicht klar - Kann man einen VIEW innerhalb einer Query anlegen und abfragen???

                        Grüße
                        Alex

                        Comment


                        • #13
                          Select distinct tab2.id where tab2.id in (select tab1.id from tab1)
                          docendo discimus

                          Comment


                          • #14
                            Hallo frauwue,

                            leider klappt dieser Ansatz nicht - da ich nicht die ID´s vergleichen kann ... D.h. die ID´s aus Tab1 sind natürlich nicht in Tab2 enthalten. Ich vergleiche die Datensätze anhand von Anmeldejahr und Geburtsort und hole mir dann einen mit diesen gleichen Attributen nach Tab3.

                            Vielleicht nochmal ein ausführlicheres Bsp:

                            Komplette Tab1:

                            ID Anmeldejahr Geburtsort
                            1 1990 Berlin
                            2 2001 München
                            3 2005 Frankfurt

                            Auszug aus Tab2:

                            ID Anmeldjahr Geburtsort
                            34 1990 Berlin
                            579 2001 München
                            9 2005 Frankfurt
                            24 2001 München


                            Tab3:

                            ID Anmeldejahr Geburtsort
                            34 ...
                            579 oder 24
                            9

                            Tab2 ist natürlich um ein Vielfaches größer und die ID`s sind nicht vergleichbar.

                            Die Anfrage zu Tab3 geht also jetzt jeden Datensatz in Tab1 Zeilenweise durch und schaut welche Datensätze in Tab2 das gleiche Anmeldejahr und Geburtsort haben. Von denen nimmt er zufällig eines und schreibt es in Tab3 ... In diesem Fall also bei 2001 und München die 579 oder 24.

                            Soweit klappt ja auch alles und ist kein Problem.

                            Das Problem entsteht wenn jetzt in Tab1 ein weiterer Datensatz mit 4, 2005, Frankfurt enthalten wäre. Das gleiche Tupel (2005, Frankfurt) ist nämlich schon im Datensatz mit 3, 2005, Frankfurt enthalten.
                            In diesem Fall könnte wiederrum der Datensatz 9, 2005, Frankfurt aus Tab2 geholt - ergo ist dieser Datensatz dann 2mal in Tab3 enthalten <- das darf nicht passieren!

                            Die Tupel in Tab2 sind aufgrund der Größe der Tabelle natürlich alle mehrmals enthalten...

                            Ich weiß jetzt nicht ob das zur Erklärung beigetragen hat oder verwirrt!

                            Comment


                            • #15
                              Wie wäre es hiermit?

                              Select min(tab2.id),tab2.anmeldejahr,tab2.geburtsort
                              where exists (select * from tab1
                              where tab1.anmeldejahr=tab2.anmeldejahr
                              and tab1.geburtsort=tab2.geburtsort)
                              group by tab2.anmeldejahr,tab2.geburtsort
                              docendo discimus

                              Comment

                              Working...
                              X