Как сравнить две таблицы?

437
03 июня 2017, 13:41

Используется
C#
MySql

Имеется
Таблица 1 - редактируемая
Таблица 2 - шаблон

Сценарий
В процессе работы программы таблица "Таблица 1" подвергается редактированию. Редактирование может заключаться в следующем:
- в "Таблица 1" количество записей равно нулю (т.е. пуста); - в "Таблица 1" количество записей больше чем в "Таблица 2";
- в "Таблица 1" количество записей меньше чем в "Таблица 2";
- в "Таблица 1" содержание записей отличается от "Таблица 2";

Количество и наименование столбцов всегда одинаково в обеих таблицах.

Вопрос
Как отследить несоответствия в "Таблица 1" по отношению к "Таблица 2"?
Состав несоответствий:
- 1. в "Таблица 1" количество записей равно нулю (т.е. пуста);
- 2. в "Таблица 1" количество записей больше чем в "Таблица 2";
В результате вывести лишние записи таблицы "Таблица 1"
- 3. в "Таблица 1" количество записей меньше чем в "Таблица 2";
В результате вывести записи которые есть в "Таблица 2", но отсутствуют в "Таблица 1"
- 4. в "Таблица 1" содержание записей отличается от "Таблица 2";

Таблицы

Таблица 1 (редактируемая)

+--------+-----------------+-----------------+-----------------+  
|  ID_ТБЛ|          pole_1 |          pole_2 |          pole_3 |   
+--------+-----------------+-----------------+-----------------+  
|      1 | pole_1_запись_1 | pole_2_запись_1 | pole_3_запись_1 |   
|      2 | pole_1_запись_2 | pole_2_запись_2 | pole_3_запись_2 |   
|      3 | pole_1_запись_3 | pole_2_запись_3 | pole_3_запись_3 |  
+--------+-----------------+-----------------+-----------------+  

Таблица 2 (ШБЛ)

+--------+-----------------+-----------------+-----------------+  
| ID_ТБЛ |          pole_1 |          pole_2 |          pole_3 |   
+--------+-----------------+-----------------+-----------------+  
|      1 | pole_1_запись_1 | pole_2_запись_1 | pole_3_запись_1 |   
|      2 | pole_1_запись_2 | pole_2_запись_2 | pole_3_запись_2 |   
|      3 | pole_1_запись_3 | pole_2_запись_3 | pole_3_запись_3 |  
+--------+-----------------+-----------------+-----------------+  
Answer 1
    1. количество записей равно нулю (т.е. таблица пуста);
SELECT COUNT(*) FROM table2;
    1. количество записей больше чем в "Таблица 2";
    1. количество записей меньше чем в "Таблица 2";
SELECT CASE WHEN c1>c2 THEN 'В таблице 1 больше записей, чем в таблице2'
            WHEN c1<c2 THEN 'В таблице 1 меньше записей, чем в таблице2'
            ELSE            'Да всё нормально с количеством записей'
            END diag
FROM (SELECT COUNT(*) c1 FROM table1) t1,
     (SELECT COUNT(*) c2 FROM table2) t2
    1. содержание записей (одна, несколько, все) отличается от записей "Таблица 2";
SELECT t1.*, t2.*
FROM table1 t1,table2 t2
WHERE t1.id=t2.id
  AND     (t1.pole_1,t1.pole_2,t1.pole_3) 
  NOT IN ((t2.pole_1,t2.pole_2,t2.pole_3))

UPD:

    1. в "Таблица 1" количество записей больше чем в "Таблица 2"; В результате вывести лишние записи таблицы "Таблица 1"
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id=t2.id
WHERE t2.id IS NULL
    1. в "Таблица 1" количество записей меньше чем в "Таблица 2"; В результате вывести записи которые есть в "Таблица 2", но отсутствуют в "Таблица 1"
SELECT t1.*
FROM table2 t1
LEFT JOIN table1 t2 ON t1.id=t2.id
WHERE t2.id IS NULL
Answer 2

Для начала вам нужен провайдер данных, например MySql connector. Скачайте и добавьте в проект. Подключайтесь к базе данных используя скачанную библиотеку.

string myConnectionString = "server=127.0.0.1;uid=root;pwd=12345;database=test;";
conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString);
conn.Open();

Напишите команду, используя SQL из соседнего ответа, либо запросите таблицу полностью и сравнивайте уже в коде.

MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "SELECT * FROM Table1";
cmd.Connection = conn;
MySqlDataReader reader = cmd.ExecuteReader();

Считывайте результат построчно, можно, например, в List.

var result = new List<object>();
while (reader.Read())
{
    result.Add(new {reader[0], reader[1], reader[2]});
}

Уходя, выключайте свет.

conn.Close();
READ ALSO
Обработка событий стилуса на ListView

Обработка событий стилуса на ListView

Все события сенсорного взаимодействия порождают соответствующие события мышиТак, для Grid достаточно подписаться на MouseDown (можно как на Right button,...

249
кастомизация стиля контрола

кастомизация стиля контрола

Есть некий контрол, а именно TextBox

216
Первый элемент ComboBox

Первый элемент ComboBox

Допустим у меня есть некий ComboBox, у которого будет задача не по назначениюДопустим первый элемент этого ComboBox должен быть всегда надпись "Выберите...

258
Проверить заполнение ListBox C#

Проверить заполнение ListBox C#

В общем, есть ListBox, мне нужно проверить, если в нем есть элементы, то должна выполниться функция, если он пустой, то ничего не должно происходить

263