Próbuję porównać dwie tabele, SQL Server, aby zweryfikować niektóre dane. Chcę zwrócić wszystkie wiersze z obu tabel, w których dane są w jednym lub drugim. Zasadniczo chcę pokazać wszystkie rozbieżności. W tym celu muszę sprawdzić trzy części danych: FirstName, LastName i Product.
Jestem całkiem nowy w SQL i wydaje się, że wiele rozwiązań, które znajduję, są zbyt skomplikowane. Nie muszę się martwić o wartości NULL.
Zacząłem od wypróbowania czegoś takiego:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
Mam jednak problem z posunięciem się dalej.
Dzięki!
EDYTOWAĆ:
Na podstawie odpowiedzi @treaschf próbowałem użyć odmiany następującego zapytania:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Ale ciągle otrzymuję 0 wyników, gdy wiem, że jest co najmniej 1 wiersz w td, który nie jest w d.
EDYTOWAĆ:
Ok, chyba to rozgryzłem. Przynajmniej w ciągu kilku minut testów wydaje mi się, że działa wystarczająco dobrze.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
To w zasadzie powie mi, co jest w moich danych testowych, a które nie ma w moich rzeczywistych danych. Co jest całkowicie w porządku w tym, co muszę zrobić.
Odpowiedzi:
JEŚLI masz tabele
A
iB
oba z columC
, oto rekordy, które są obecne w tabeli,A
ale nie wB
:Aby uzyskać wszystkie różnice za pomocą jednego zapytania, należy użyć pełnego sprzężenia, takiego jak to:
Co trzeba wiedzieć, w tym przypadku jest to, że kiedy zapis można znaleźć
A
, ale nie wB
, niż kolumny, które pochodzą zeB
będzie NULL, i podobnie do tych, które są obecne wB
, a nieA
, kolumn zA
woli być zerowy.źródło
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Występuje błąd, jeśli nazwy tabel są takie same, a ty wyciągasz je z dwóch różnych baz danych.a.dbo.student as
ab.dbo.student bs
następnie odwołać się do tabel za pomocąas
ibs
źródło
SELECT *
działa, jeśli tak jest w przypadku wszystkich kolumn; jeśli nie, po prostu wybierz jakiś podzbiór.Wiem, że to może nie być popularna odpowiedź, ale zgadzam się z @Randy Minder na temat korzystania z narzędzia innej firmy, gdy potrzebne jest bardziej złożone porównanie.
Ten konkretny przypadek jest tutaj łatwy i w tym przypadku takie narzędzia nie są potrzebne, ale może się to łatwo skomplikować, jeśli wprowadzisz więcej kolumn, baz danych na dwóch serwerach, bardziej złożone kryteria porównania i tym podobne.
Istnieje wiele takich narzędzi, takich jak ApexSQL Data Diff lub Quest Toad, i zawsze można ich używać w trybie próbnym, aby wykonać zadanie.
źródło
tablediff
narzędzie wiersza polecenia programu SQL Server , o którym mowa tutaj .Aby uzyskać wszystkie różnice między dwiema tabelami, możesz użyć podobnie jak ja tego żądania SQL:
źródło
Prosta odmiana odpowiedzi @erikkallen, która pokazuje, w której tabeli znajduje się wiersz:
Jeśli pojawi się błąd
to może pomóc dodać
źródło
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
przy tym wyborze. Musiałem dodać tę'table1' as source,
część również do części wyjątkowej. - Zredagowałem na to odpowiedź.Jeśli chcesz dowiedzieć się, które wartości kolumn są różne, możesz użyć modelu Entity-Attribute-Value:
PRZYKŁAD FIDDLE SQL
źródło
Spróbuj tego :
O wiele prostszy do odczytania.
źródło
To załatwi sprawę, podobnie jak w rozwiązaniu Tiago , zwróci również tabelę „source”.
wynik będzie zawierać różnice między tabelami, w kolumnie _tabloc będziesz mieć odwołanie do tabeli.
źródło
Prezentując Cadillac of Diffs jako SP. Zobacz w środku podstawowy szablon oparty na odpowiedzi @erikkallen. To wspiera
Stosowanie:
Kod:
źródło
Możesz użyć oprócz, na przykład, czegoś takiego:
źródło
Dla prostego testu zadymienia, w którym starasz się upewnić, że dwie tabele pasują do siebie, martwiąc się o nazwy kolumn:
Możesz łatwo napisać procedurę sklepu, aby porównać partię tabel.
źródło
Występuje problem z wydajnością związany z lewym łączeniem, a także pełnym łączeniem z dużymi danymi.
Moim zdaniem jest to najlepsze rozwiązanie:
źródło