none
Datensatzvergleich von 2 Tabellen RRS feed

  • Frage

  • Hallo,

    ich habe 2 Tabellen, komplett dasselbe Design.

    In Tabelle 1 stehen 2 Datensätze:

    Product_01, Wert1, Wert1

    Product_01, Wert1, Wert2

    in Tabelle 2 steht 1 Datensatz

    Product_01, Wert1, Wert1

    nun möchte ich mir den Datensatz welcher nicht in Tabelle 2 entahlten ist ausgeben lassen -> Product_01, Wert1, Wert2

    Dafür wollte ich

    Select * from Tabelle1 where not exists (Select * from Tabelle2)

    verwenden.

    Dies liefert mir allerdings keinen Treffer.

    Wo habe ich gerade meinen Denkfehler?

    Danke für jede Unterstützung!

    Mittwoch, 14. November 2018 13:23

Antworten

  • Hier ein lauffähiges Beispiel mit beiden Varianten:

    DECLARE @Tabelle1 AS TABLE
    (
        Product nvarchar(50),
        Wert1   nvarchar(50),
        Wert2   nvarchar(50)
    );
    
    DECLARE @Tabelle2 AS TABLE
    (
        Product nvarchar(50),
        Wert1   nvarchar(50),
        Wert2   nvarchar(50)
    );
    
    INSERT INTO @Tabelle1
    (
        Product, Wert1, Wert2
    )
    VALUES
    ( '4711', '01', '02' ),
    ( '4711', '01', '03' )
    
    INSERT INTO @Tabelle2
    (
        Product, Wert1, Wert2
    )
    VALUES
    ( '4711', '01', '03' )
    
    SELECT *
    FROM   @Tabelle1 t1
           LEFT OUTER JOIN @Tabelle2 t2 ON t1.Product = t2.Product
                                       AND t1.Wert1   = t2.Wert1
                                       AND t1.Wert2   = t2.Wert2
    WHERE  t2.Product IS NULL
    
    SELECT *
    FROM   @Tabelle1 t1
    WHERE  NOT EXISTS (
                        SELECT *
                        FROM   @Tabelle2 t2
                        WHERE  t1.Product = t2.Product
                        AND    t1.Wert1   = t2.Wert1
                        AND    t1.Wert2   = t2.Wert2
                      )

     

    Wenn das bei dir auch falsche Ergebnisse bringt, stimmt wohl was mit deiner Installation nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 14. November 2018 14:27
    Moderator

Alle Antworten

  • Hallo, in deinem Fall würde ich den Left outer join nutzen

    https://stackoverflow.com/questions/406294/left-join-vs-left-outer-join-in-sql-server


    Benjamin Hoch
    MCSE: Data Platform & Data Management and Analytics
    MCSA: SQL Server 2012/2014 & 2016 DB Administration
    MCSA: Windows Server 2012

    Mittwoch, 14. November 2018 13:29
  • Moin,

    hab jetzt folgende Anfrage gebaut

    Select * from Tabelle1 t1
    left outer join Tabelle2 as t2
    on t1.Wert1 = t2.Wert1 AND t1.Wert2 = t2.Wert2
    where 	   t1.Wert1 = t2.Wert2
    and	   t1.Wert2 = t2.Wert2

    Dies liefert mir nun ein Ergebnis, welches ich allerdings nicht so richtig zu deuten weiß. Es sind nicht die Delta Datensätze, nicht alle Datensätze, bin ein wenig ratlos was das für ein Ergebnis sein soll.

    Mittwoch, 14. November 2018 13:42
  • Hi,

    probier es mal damit:

    SELECT *
    FROM   Tabelle1 t1
           LEFT OUTER JOIN Tabelle2 t2 ON t1.Product = t2.Product AND t1.Wert1 = t2.Wert1 AND t1.Wert2 = t2.Wert2
    WHERE  t2.Product IS NULL


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 14. November 2018 13:46
    Moderator
  • Ohne deine Tabellen zu kennen würde ich aber mal vermuten dass du die Prüfung falsch hat

    Select * from Tabelle1 t1 left outer join Tabelle2 as t2 on t1.Wert1 = t2.Wert1

    WHERE  t2.wert1 IS NULL



    Benjamin Hoch
    MCSE: Data Platform & Data Management and Analytics
    MCSA: SQL Server 2012/2014 & 2016 DB Administration
    MCSA: Windows Server 2012



    Mittwoch, 14. November 2018 13:46
  • Dein Ansatz "where not exists " ist schon ok, allerdings musst du in der where-Klausel dann alle Felder aufführen:

    select * from MyTable1 A
    where not exists (
    select * from MyTable2 B
    where A.F1 = B.F1 and A.F2 = B.F2 ....
    )

    Für den 2. Vergleich tauscht du die Tabellen einfach aus.

    Mittwoch, 14. November 2018 14:08
  • So sollte es eigentlich gehen, wenn du alle 3 Felder vergleichen willst!

    Select * from Tabelle1 a where not exists (Select * from Tabelle2 b where a.Product_01 = b.Product_01 and a.Wert1 = b.Wert1 and a.Wert2 = b.Wert2 );


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Mittwoch, 14. November 2018 14:15
  • Das habe ich auch schon versucht

    SELECT * FROM Tabelle1 as t1
    WHERE  NOT exists
           (
    SELECT * FROM   Tabelle2 as t2
            WHERE
               t2.Product = t1.Product
    and	   t2.Wert1 = t1.Wert1
    and	   t2.Wert2 = t1.Wert2)

    es kommt ein nicht nachvollziehabres Ergebnis. Es werden mehrer Datensätze ausgegeben welche ich aber problemlos per select in den jeweiligen Tabellen finden kann.

    Mal ein Beispiel mit Daten

    Tabelle1
    Product - Wert1 - Wert2
    4711 - 01 - 02
    4711 - 01 - 03
    
    Tabelle1
    Product - Wert1 - Wert2
    4711 - 01 - 03

    Ich will den Datensatz 

    4711 - 01 - 02

    ausgegeben bekommen




    • Bearbeitet D0c_cR4Zy Mittwoch, 14. November 2018 14:27
    Mittwoch, 14. November 2018 14:21
  • Hier ein lauffähiges Beispiel mit beiden Varianten:

    DECLARE @Tabelle1 AS TABLE
    (
        Product nvarchar(50),
        Wert1   nvarchar(50),
        Wert2   nvarchar(50)
    );
    
    DECLARE @Tabelle2 AS TABLE
    (
        Product nvarchar(50),
        Wert1   nvarchar(50),
        Wert2   nvarchar(50)
    );
    
    INSERT INTO @Tabelle1
    (
        Product, Wert1, Wert2
    )
    VALUES
    ( '4711', '01', '02' ),
    ( '4711', '01', '03' )
    
    INSERT INTO @Tabelle2
    (
        Product, Wert1, Wert2
    )
    VALUES
    ( '4711', '01', '03' )
    
    SELECT *
    FROM   @Tabelle1 t1
           LEFT OUTER JOIN @Tabelle2 t2 ON t1.Product = t2.Product
                                       AND t1.Wert1   = t2.Wert1
                                       AND t1.Wert2   = t2.Wert2
    WHERE  t2.Product IS NULL
    
    SELECT *
    FROM   @Tabelle1 t1
    WHERE  NOT EXISTS (
                        SELECT *
                        FROM   @Tabelle2 t2
                        WHERE  t1.Product = t2.Product
                        AND    t1.Wert1   = t2.Wert1
                        AND    t1.Wert2   = t2.Wert2
                      )

     

    Wenn das bei dir auch falsche Ergebnisse bringt, stimmt wohl was mit deiner Installation nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 14. November 2018 14:27
    Moderator
  • select * from tabelle1
    except
    select * from tabelle2

    Donnerstag, 15. November 2018 08:45