2016-11-15 4 views
-3

У меня есть 2 больших стола (около 100-150 тыс. Строк в каждом).Сравнить 2 больших таблицы (SQL Server)

Структура этих таблиц одинакова. Идентификаторы сущностей одинаковы в каждой таблице.

Мне нужен очень быстрый способ, чтобы сравнить эти таблицы и ответить на следующие вопросы:

  1. Каких Их поля отличаются от строки другой таблицы?
  2. Какие идентификаторы существуют в первой таблице и не существуют во второй таблице?
  3. Какие идентификаторы существуют во второй таблице и не существует в первой таблице?

Спасибо!

Edit: мне нужно сделать это сравнение с использованием C# или, может быть, хранимые процедуры (а затем выбрать результаты по C#)

+1

Вы еще что-нибудь пробовали? –

+0

Что-нибудь отличие сравнить большие таблицы по сравнению с маленькими? –

+5

150K строк не большой стол! 1 миллиард строк - большая таблица –

ответ

2

Если у вас есть две таблицы Table1 и Table2 и они имеют ту же структуру и первичный ключ с именем ID вы можете использовать этот SQL:

--Find rows that exist in both Table1 and Table2 
SELECT * 
FROM Table1 
WHERE EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID) 

--Find rows that exist in Table1 but not Table2 
SELECT * 
FROM Table1 
WHERE NOT EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID) 

Если вы пытаетесь сравнить и найти строки, которые отличаются в одном столбце или другой, что немного сложнее. Вы можете написать SQL для проверки каждого столбца самостоятельно, но может быть проще добавить временный столбец CHECKSUM в обе таблицы и сравнить их. Если контрольные суммы различаются, то один или несколько столбцов отличаются друг от друга.

1

SQL Data Compare является отличным инструментом для этого. Кроме того, в Microsoft Visual Studio SQL Server Data Tools есть функция сравнения данных.

0

Я нашел следующий метод, который очень хорошо работает при сравнении больших наборов данных.

http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx

В основном UNION ALL из двух источников данных затем агрегировать их и возвращать только те строки, которые не имеют идентичные соответствующие строки в другой таблице.

With unionCTE As (
    Select 'TableA' As TableName, col1, col2 
     From TableA 
    Union All 
    Select 'TableB', col1, col2 
     From TableB) 
Select Max(TableName), col1, col2 
    From unionCTE 
    Group By col1, col2 
    Having Count(*) = 1 
    Order By col1, col2, TableName; 

Это покажет результаты в одном результирующем, и если есть какие-либо строки, которые имеют одни и те же основные, но разные значения строки будут друг над другом, так что вы можете легко сравнить, какие значения были изменены между столы.

Это можно легко поместить в хранимую процедуру, если хотите.