Announcement

Collapse
No announcement yet.

tabelle auf sich selbst joinen

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

  • tabelle auf sich selbst joinen

    Hallo aller seits:
    Ich habe in meiner Tabelle Daten die sich überschneiden können:
    Ich weiss nicht wie ich meiner Abfrage formuliere um es zu überprüfen ob sich die Daten überschneiden dass hier unten ein Beispiel von Daten die richtig eingelegt sind und sich auch nicht überschneiden (Gültig_bis--> Gültig_Ab) :

    ILN--------------ID----- Gültig_AB ---------------- Gültig_BIS
    4313852018618--5416---2010-02-03 00:00:00.000---2010-02-28 23:59:59.000
    4313852018618--5416---2010-03-01 00:00:00.000---4000-12-31 00:00:00.000

    könnte ihr mir zeigen wie ich die tabelle auf sich selbst joine und die überschneidung überprüfe.
    Danke im vorraus

  • #2
    SELECT *
    FROM Tabelle AS T1
    JOIn Tabelle AS T2 ON T1.ID = T2.ID

    Comment


    • #3
      Sind deine Beispieldaten insofern korrekt, als ILN und ID immer gleich sind (diese also für die Gruppierung erforderlich sind) oder gehört was davom zum PK? Das macht nämlich in der Abfrage einen ziemlichen Unterschied.

      bye,
      Helmut

      Comment


      • #4
        Danke für eure Antwort, ja das Beispiel ist Korrekt der ID kann 2 mal eingefügt werden mit unterschiedliche Datums, wie bekomme ich raus welche sich überschneiden könnten.

        Comment


        • #5
          Hallo, Ich habe es jetzt geschafft alle die den ID doppelt haben, aus zu geben
          Nach den Modell von ebis:
          select
          P.ILN,
          X.ID,
          P.GUELTIG_AB,
          P.GUELTIG_BIS
          from(
          select ID
          from MARKT
          GROUP BY ID
          HAVING COUNT(*)>1
          ) AS X
          JOIN MARKT AS P ON
          P.ID = X.ID
          Group By P.ILN, X.ID, P.GUELTIG_AB, P.GUELTIG_BIS
          ORDER BY X.ID
          jetzt bleibt die Frage wie ich die doppelte Einträge die sich beim Datum überschneiden ausgebe?
          Zuletzt editiert von foufou; 16.03.2010, 11:06.

          Comment


          • #6
            Originally posted by foufou View Post
            jetzt bleibt die Frage wie ich die doppelte Einträge die sich beim Datum überschneiden ausgebe?
            Vieleicht

            select
            P.ILN,
            X.ID,
            P.GUELTIG_AB,
            P.GUELTIG_BIS
            from(
            select ID
            from MARKT
            GROUP BY ID
            HAVING COUNT(*)>1
            ) AS X
            JOIN MARKT AS P ON
            P.ID = X.ID
            AND P.GUELTIG_ab <> X.Gueltig_ab
            Group By P.ILN, X.ID, P.GUELTIG_AB, P.GUELTIG_BIS
            ORDER BY X.ID

            Comment


            • #7
              danke Stefan, wenn ich es einfüge dann bekomme ich ein Fehler das er X.Gueltig_AB ein Ungültige Spaltenname ist, füge ich X.GUELTIG_AB in die innere Select dann habe ich Problem mit Having und bekomme eine leere Menge!

              Comment


              • #8
                Originally posted by foufou View Post
                Hallo aller seits:
                Ich habe in meiner Tabelle Daten die sich überschneiden können:
                Ich weiss nicht wie ich meiner Abfrage formuliere um es zu überprüfen ob sich die Daten überschneiden dass hier unten ein Beispiel von Daten die richtig eingelegt sind und sich auch nicht überschneiden (Gültig_bis--> Gültig_Ab) :

                ILN--------------ID----- Gültig_AB ---------------- Gültig_BIS
                4313852018618--5416---2010-02-03 00:00:00.000---2010-02-28 23:59:59.000
                4313852018618--5416---2010-03-01 00:00:00.000---4000-12-31 00:00:00.000

                könnte ihr mir zeigen wie ich die tabelle auf sich selbst joine und die überschneidung überprüfe.
                Danke im vorraus
                hmm, so? (3.Zeile auskommentieren, dann kein Result, weil keine Überschneidung mehr)
                [HIGHLIGHT="SQL"]WITH Markt (ILN, ID, GUELTIG_AB, GUELTIG_BIS) AS
                ( SELECT '4313852018618', 5416, CONVERT (DATETIME2, '2010-02-03', 120), CONVERT (DATETIME2, '2010-02-28 23:59:59.000', 120)
                UNION ALL SELECT '4313852018618', 5416, CONVERT (DATETIME2, '2010-02-15', 120),CONVERT (DATETIME2, '2010-03-15', 120)
                UNION ALL SELECT '4313852018618', 5416, CONVERT (DATETIME2, '2010-03-01', 120),CONVERT (DATETIME2, '4000-12-31', 120)
                )
                SELECT * INTO #Markt FROM Markt ;

                SELECT P.ILN
                , X.ID
                , x.GUELTIG_AB
                , x.GUELTIG_BIS
                FROM (
                SELECT ID
                , GUELTIG_AB
                , Gueltig_Bis
                , ROW_NUMBER () OVER (PARTITION BY ID ORDER BY Gueltig_ab) AS RowNum
                FROM #MARKT
                ) AS X
                JOIN (
                SELECT ID
                , GUELTIG_AB
                , Gueltig_Bis
                , ROW_NUMBER () OVER (PARTITION BY ID ORDER BY Gueltig_ab) AS RowNum
                FROM #MARKT
                ) AS Y ON Y.ID = X.ID
                AND Y.RowNum = X.RowNum - 1
                AND Y.Gueltig_bis >= X.Gueltig_ab

                JOIN #Markt AS P ON P.ID = X.ID
                AND Y.Gueltig_ab = P.Gueltig_ab;

                DROP TABLE #Markt[/HIGHLIGHT]

                Comment


                • #9
                  Danke ebis,
                  Ich habe es jetzt ein bißien anderes gelöst und es funktioniert:

                  Code:
                  with temp as(
                  select top(10000000000)
                  	 a.iln, a.id, a.seriennummer, 
                                 a.gueltig_ab as A_GUELTIG_AB, 
                                 a.gueltig_bis as A_GUELTIG_BIS,
                  	 b.gueltig_ab as B_GUELTIG_AB, 
                                 b.gueltig_bis as B_GUELTIG_BIS, 
                                 Row_Number() Over(PARTITION BY a.id ORDER BY a.gueltig_ab) as  RowNum
                                 From MARKT a JOIN MARKT b ON ( b.id = a.id  )
                                order by a.id
                  )
                  
                  select 
                     iln, id, seriennummer, A_GUELTIG_AB, A_GUELTIG_BIS, B_GUELTIG_AB ,B_GUELTIG_BIS,
                     RowNum
                    from temp c 
                    where (RowNum = 1) AND A_GUELTIG_BIS >= B_GUELTIG_AB

                  Comment

                  Working...
                  X