Announcement

Collapse
No announcement yet.

Abfrage gesucht...

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

  • #16
    Das subselect ist ungefähr wie ich meine Anfrage auch aufgebaut habe - aber warum nimmst du min(tab2.id) ?

    Das group by reduziert ja wieder alle Datensätze mit ein und demselbern Tupel (Anmeldejahr, Geburtsort) auf einen Einzigen. Aber das ist ja nicht Sinn der Sache - es sollen ja mehrere gleiche Tupel in Tab3 aus Tab2 geholt werden - nur eben nicht exakt dieselben Datensätze (hier mit gleicher ID), sondern unterschiedliche ID´s (aber mit dem gleichen Tupel)...

    Durch das order by rand (10) wird ja soweit ich weiß nicht wirklich zufällig ausgewählt ... und daher nimmt die Anfrage bei einem bestimten Tupel auch immer denselben Datensatz aus Tab2 (ich denke mal es wird immer der Datensatz mit dem betreffenden Tupel genommen, den die Anfrage zuerst beim durchgehen des Datensatz (Tab2) findet).

    Comment


    • #17
      Es ist nicht so ganz einfach Dich wirklich zu verstehen,
      dann schreibe halt:

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

      Comment


      • #18
        Hallo Alex,

        ich glaube so langsam wird mir klar was du willst. Wenn ich dich richtig verstehe, dann ist jedoch dein Bsp. schlecht gewählt, da es den "Knackpunkt" nicht deutlich macht. Nämlich dann wenn in Tab1 ein bestimmtes Tupel mehrfach vorkommt. Wenn ich deine Beispieldaten mal erweitere:

        Komplette Tab1:

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

        dann hättest du als Ergebnis gerne:

        34
        579
        9
        24

        also für das "doppelt" vorkommende 2001/München einmal die ID 579 und einmal die 24. Hab ich das jetzt richtig?
        Wenn ja, dann stellt sich mir sofort die nächste Frage: Was ist wenn es mehr Tupel 2001/München in Tab1 gibt, als in Tab2?
        In jedem Fall wirst du das nicht mit einem einzigen SQL-Statement lösen können, da für die Entscheidung welcher DS aus tab2 (bei Vorhandensein mehrerer) ausgewählt werden soll, Bezug auf die bereits ausgewählte Datenmenge genommen werden müßte. Und da SQL Mengen- und nicht Zeilenorientiert arbeitet, wirst du hier wohl in einem Script eine Schleife zum Befüllen deiner tab3 programmieren müssen.

        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


        • #19
          Das hatte ich befürchtet ... :-(

          Hier ist mal meine gesamte (etwas vereinfachte) Query - worin eben besagtes Problem besteht!

          CREATE TABLE Tab3
          SELECT
          (SELECT s.appln_id AS apn_id
          FROM Tab2 s
          WHERE s.cny_code = t.cny_code
          AND SUBSTRING(s.appln_filing_date,1,4) = SUBSTRING(t.apn_date,1,4)
          AND s.appln_id NOT IN (SELECT apn_id FROM Tab1)
          ORDER BY rand(10)
          LIMIT 1) refID,
          (SELECT s.cny_code
          FROM Tab2 s
          WHERE s.cny_code = t.cny_code
          AND SUBSTRING(s.appln_filing_date,1,4) = SUBSTRING(t.apn_date,1,4)
          AND s.appln_id NOT IN (SELECT apn_id FROM Tab1)
          ORDER BY rand(10)
          LIMIT 1) refCNY,
          (SELECT s.appln_filing_date AS apn_date
          FROM Tab2 s
          WHERE s.cny_code = t.cny_code
          AND SUBSTRING(s.appln_filing_date,1,4) = SUBSTRING(t.apn_date,1,4)
          AND s.appln_id NOT IN (SELECT apn_id FROM Tab1)
          ORDER BY rand(10)
          LIMIT 1) refAPN,
          FROM Tab1 t;


          Die Query geht also für jeden Tab1-Datensatz Tab2 durch und holt sich jeweils eine zufällige refID (appln_id), refCNY (cny_code) = Geburtsort und refAPN (appln_filing_date) = Anmeldedatum. Das funktioniert auch alles wunderbar ...

          Bei den Auswertungen ist mir aber aufgefallen, dass die gleichen Tripel (refID, redCNY, refAPN) mehrfach auftauchen... das gilt es zu verhindern. Die naheliegendste Lösung war für mich - wenn ich auf die sich erstellende Tab3 zugreifen könnte und immer abgleichen könnte, ob die refID schon in Tab3 existiert (wenn ja - hole anderes Tripel) ... nur das geht anscheinend so nicht!

          Wird es dadurch verständlicher?

          Comment


          • #20
            hi falk,

            EXAKT ... genau das möchte ich :-) ...

            mehr Tupel in Tab1 als Tab2 gibt es nicht ... Tab1 ist eine kleine Teilmenge aus Tab2 mit gewissenen anderen Attributen.

            Ok - nicht Zeilenorientiert .... sondern mengenorientiert! Es gibt also keine Möglichkeit das so zu lösen ja? - Die Anfrage so funktioniert ja.

            Und bei Skriptprgrammierung hört es bei mir auf ... das hab ich zumindest noch nie gemacht! Kann ich das auch als Abfrage an die DB richten?

            lg
            alex

            Comment


            • #21
              Originally posted by Alexander_ View Post
              ...Es gibt also keine Möglichkeit das so zu lösen ja? - Die Anfrage so funktioniert ja.
              Nach meiner Kenntniss gibt es keine Möglichkeit innerhalb einer Abfrage Bezug auf "sich selbst" zu nehmen. Und eigentlich macht eine Bedingung "Nimm diesen DS nur wenn er nicht in der aktuellen Menge enthalten ist" auch keinen Sinn, denn in dem Moment indem der DS ausgewählt wird weil die Bedingung TRUE ist wird sie FALSE, da der DS dann in der Menge enthalten ist und der DS muß wieder verworfen werden, was die Bedingung wieder zur TRUE macht...

              Hier macht eine SP, die die Tab3 erstellt und dann in einer Schleife aus den Werten aus Tab1 und Tab2 einzeln befüllt mehr Sinn. Innerhalb der Schleife kann dann auch die "wachsende" Datenmenge in Tab3 abgefragt werden.

              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


              • #22
                Das hört sich ja schonmal gut an ...

                Eine SP?
                Und wie funktioniert sowas? Hab bisher nur ganz simple mit SQL-Querys über phpmyadmin und SQL-Browser gearbeitet...

                Kann mir da einer Hilfestellung geben?

                Comment


                • #23
                  Hallo Alex,

                  infos zu Stored Procedures (SP) findest du im MySQL-Handbuch zu Stored Programs and Views.

                  Aussehen könnte das Ganze dann etwa so:
                  [highlight=sql]
                  DELIMITER |

                  CREATE PROCEDURE TestDaten()
                  begin
                  /* Cursor für die Hauptschleife */
                  declare curLoop CURSOR for
                  SELECT tab1.ID
                  FROM tab1;

                  declare tab1_ID int;
                  declare tab2_ID int;

                  declare no_data_found int DEFAULT 0;
                  declare CONTINUE HANDLER for NOT FOUND SET no_data_found = 1;

                  /* Tabelle tab3 erstellen, falls sie nicht existiert */
                  CREATE TABLE IF NOT EXISTS tab3 (
                  apn_id integer(11)
                  );
                  /* Alle Daten in tab3 löschen */
                  TRUNCATE TABLE tab3;

                  open curLoop; /* Cursor öffnen */
                  repeat /* Schleife */
                  fetch curLoop INTO tab1_ID;
                  if NOT no_data_found then
                  /* Anhand tab1_id die ID aus tab2 holen (diese darf noch nicht in tab3
                  enthalten sein) */
                  SELECT tab2.ID INTO tab2_ID
                  FROM tab1
                  INNER JOIN tab2 ON tab2.Anmeldjahr = tab1.Anmeldjahr
                  AND tab2.Geburtsort = tab1.Geburtsort
                  WHERE tab1.ID = tab1_ID
                  AND tab2.ID NOT IN (
                  SELECT apn_id FROM tab3
                  )
                  ORDER BY rand()
                  LIMIT 1;

                  /* Die gefundene tab2_ID in tab3 schreiben */
                  INSERT INTO tab3 VALUES(tab2_ID);

                  end if;
                  until no_data_found end repeat;
                  close curLoop;
                  end;
                  |

                  DELIMITER ;
                  call TestDaten();
                  [/highlight]
                  Das ist jetzt "frei Schnauze" runtergetippt, also nicht getestet und kann durchaus noch Fehler enthalten (aber du willst ja auch was lernen )

                  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


                  • #24
                    hi falk,

                    also erstmal vielen Dank - Anfrage funktioniert und macht genau das was ich will :-)

                    Allerdings (deswegen meld ich mich auch erst jetzt zurück) dauert die Anfrage extrem lange - ich hatte Sie jetzt seit letzten Donnerstag laufen und Sie ist nicht mal bis zur Hälfte gekommen. Zwar sind die Datenmengen recht groß - aber gibt es da eine Möglichkeit die Effizienz zu steigern.

                    Es ist so das die Tab1 zu welchen er die Beispiele holen soll ~ 8000 Datensätze hat - Tab3 wo er Sie rausholt hat aber ~ 60 Mio...

                    Lg
                    alex

                    Comment


                    • #25
                      Hallo Alex,

                      da kannst du jetzt erstmal nur die "Standardsachen" probieren: Vernünftige Indizes vorhanden? Sonst anlegen. Mal testweise das
                      [highlight=sql]
                      ...
                      tab2.ID NOT IN (
                      SELECT apn_id
                      FROM tab3)
                      ...
                      [/highlight]
                      durch
                      [highlight=sql]
                      ...
                      NOT EXISTS (
                      SELECT 'X'
                      FROM tab3
                      WHERE tab3.apn_id = tab2.ID)
                      ...
                      [/highlight]
                      ersetzen.
                      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


                      • #26
                        hi Falk,

                        habe jetzt mal einige Änderungen gemacht - mal sehen ob die Performanz besser wird ...
                        Zuletzt editiert von Alexander_; 14.10.2009, 19:25.

                        Comment


                        • #27
                          Hi Hallo,

                          ich bins mal wieder ... also die Performanz ist jetzt auf jeden Fall besser...

                          Ich hab jetzt ein anderes kleines Problem. Ich möchte zu der generierten ID - also in Falk`s Abfrage tab2_ID noch eine match_id aus der tab1 dazunehmen. Somit möchte ich die AusgangsID´s aus Tab1 mit der neuen ID aus Tab2 verbinden.


                          Beispiel:
                          Tab1 :
                          match_id ID
                          1 , 25
                          2 , 33

                          Tab2:
                          ID
                          11
                          26
                          30
                          45

                          Tab3:
                          match_id ID
                          1 , 26
                          2 , 45


                          Wie kann ich das machen?

                          Also irgendwie sowas:

                          INSERT INTO tab3 VALUES(tab2_ID, match_id from tab1);

                          Aber die Syntax klappt natürlich nicht ...

                          Grüße
                          Alex

                          Comment


                          • #28
                            Hat sich erledigt ...

                            Comment

                            Working...
                            X