Benutzer mit den meisten Antworten
Datensatzvergleich von 2 Tabellen

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!
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
- Bearbeitet Stefan FalzModerator Mittwoch, 14. November 2018 14:31
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Montag, 19. November 2018 07:54
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Montag, 26. November 2018 12:37
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 -
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.
-
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 -
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
- Bearbeitet Benjamin.Hoch Mittwoch, 14. November 2018 13:47
-
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.
-
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
-
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
-
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
- Bearbeitet Stefan FalzModerator Mittwoch, 14. November 2018 14:31
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Montag, 19. November 2018 07:54
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Montag, 26. November 2018 12:37