Announcement

Collapse
No announcement yet.

verzwickter Join

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

  • verzwickter Join

    Hallo,
    ich habe ein Problem bei einer Abfrage, bei der ein join gemacht werden soll, der etwas Logik enthält.

    Erstmal die Tabellen die gejoint werden sollen sehen in etwa so aus:
    Tabelle1 - Start :
    msec srno dienst status
    10 eindeutig1 foo Start
    20 eindeutig1 foo Start
    22 eindeutig1 foo Start
    51 eindeutig2 foo Start
    56 eindeutig2 foo Start
    65 eindeutig2 foo Start
    ... ... ... ...

    Tabelle2 - Ende:
    msec srno dienst status
    17 eindeutig1 foo Ende
    27 eindeutig1 foo Ende
    30 eindeutig1 foo Ende
    61 eindeutig2 foo Ende
    64 eindeutig2 foo Ende
    73 eindeutig2 foo Ende
    ... ... ... ...

    Der Join soll nun auf der srno passieren, so dass die msec von Tabelle1 als beginnmsec und die msec von Tabelle2 als endmsec in die endgültige Tabelle übernommen werden. Da die srno aber bei den drei Einträgen jeweils gleich ist, bekomme ich ein Kreuzprodukt der Zeiten, so dass jede Start mit jeder Endzeit verknüpft ist. Das soll aber nicht der Fall sein.
    Eigentlich möchte ich, dass immer nur die kleinste msec von Tab1 mit der kleinsten msec von Tab2, jeweils mit gleicher srno, verknüpft wird. Mit den anderen Einträgen genauso, also zweites mit zweites und letztes mit letztem, so dass in der endgültigen Tabelle, zu jeder Start nur eine Endzeit enthalten ist.
    Leider weiss ich nicht, wie ich der Datenbank das mitteilen soll, weil ich die Felder ja schlecht umnummerieren kann, um Tab1.nummer=Tab2.nummer abzufragen oder so.

    Die SQL Abfrage sieht momentan so aus:
    INSERT INTO ZielTabelle (srno, beginmsec, endmsec) SELECT enter.srno, enter.msec, success.msec FROM (SELECT srno, msec FROM Ausgangstabelle WHERE status='Start' AND dienst='foo' ORDER BY msec) enter, (SELECT srno, msec FROM Ausgangstabelle WHERE status='Ende' AND dienst ='foo' ORDER BY msec) success WHERE enter.srno = success.srno

    Bitte helft mir, oder sagt zumindest ob es überhaupt möglich ist, ich weiss einfahc nich mehr weiter.

  • #2
    [highlight="sql"]
    select
    t1.srno, min(t1.msec) as start,min( t2.msec) as ende
    from
    tabelle1 t1 join tabelle t2 on t2.srno = t1.srno
    group by
    t1.srno, s2.srno;
    [/highlight]

    Comment


    • #3
      Hallo Markus,

      so einfach ist das nicht zu lösen. Hiermit erhält man doch immer nur die kleinsten Pärchen.

      Gruß
      docendo discimus

      Comment


      • #4
        Das will er doch auch:
        Eigentlich möchte ich, dass immer nur die kleinste msec von Tab1 mit der kleinsten msec von Tab2, jeweils mit gleicher srno, verknüpft wird.

        Comment


        • #5
          Hallo Markus,

          Du hast nicht weitergelesen.


          Mit den anderen Einträgen genauso, also zweites mit zweites und letztes mit letztem, so dass in der endgültigen Tabelle, zu jeder Start nur eine Endzeit enthalten ist.

          Gruß
          docendo discimus

          Comment


          • #6
            mögliche löung

            Servus,
            zum Durchnummerieren, wollte ich das Ganze jetzt so machen, dass ich eine Spalte hinzufügen, die eine JoinID enthält, die also besagt welches Element mit welchem verknüpft werden soll.
            Diese Spalte wird folgendermaßen erzeugt:
            SELECT srno, msec, (SELECT Count(srno) FROM Ausgangstabelle WHERE srno = input.srno AND msec <= input.msec) AS JoinID

            input ist die Tabelle aus der nachher die ganzen Daten gezogen werden, dabei handelt es sich wieder um die Ausgangstabelle.

            Da die Nummerierung jetzt aber für jedes Element einzeln berechnet wird, schaffen die Datenbank und der Rechner es bei vielen Daten nicht mehr die JoinID ausreichend schnell zuberechnen.

            Hat jemand eine Idee zur Performancesteigerung, oder eine Idee, wie ich die JoinID für alle gleichzeitig bestimmen kann? EIn Index auf einer sortierten Group würde mir ja schon reichen, aber ich weiss nicht wie ich so etwas erstelle.

            Danke schonmal.

            Comment

            Working...
            X