Сравнение двух таблиц в одной базе данных и различие в другую таблицу без повторения записей - PullRequest
0 голосов
/ 09 июля 2019

Я делаю проект на RFID-ридере с использованием SQL Server, Visual Studio, C #. У меня есть база данных с именем rfid с тремя таблицами table1, table2 и table3.

table1 заполнен сведениями о фиксированных тегах, и эти записи не будут изменены. Каждый тег rfid имеет идентичный код, вызывающий номер EPC, и мы можем идентифицировать их с ним.

Table3 заполняется записями тега, которые считываются считывателем RFID. Единственное изменение между table1 и table3 - это то, что table1 - фиксированная таблица, и мы дали эти записи раньше. Но таблица 3 всегда заполняется операцией чтения считывателя. Затем заполнение занимает несколько секунд.

Table2 заполняется записями разностей в таблицах 1 и 3, когда они сравниваются. Я попробовал обычный метод сравнения таблиц и записал записи в таблицу2, но проблема в том, что записи повторяются в таблице2, потому что читатель постоянно читает теги. Я хочу остановить это. И еще одна вещь: поскольку заполнение таблицы 3 занимает несколько секунд, в качестве разницы отображаются неправильные теги.

В качестве примера я попробовал обычный метод сравнения таблиц и перенес записи в таблицу2, но проблема в том, что записи повторяются в таблице2, потому что читатель постоянно читает теги. Я хочу остановить это. И еще одна вещь: поскольку заполнение таблицы 3 занимает несколько секунд, в качестве разницы отображаются неправильные теги. В качестве примера. Допустим, в таблице 10 записей. И мы даем те же 8 тегов для чтения, в том числе и в table2. Так что теперь я ожидаю только две записи разницы тегов в таблице 2 в соответствии с моим кодом. Но есть более двух записей. Причина в том, что table3 заполняет один за другим или не так, как все 8 тегов одновременно. Затем, как только деталь тега попадает в таблицу3, начинается сравнение. Тогда он принимает разницу как остальные девять тегов.

Теперь я хочу остановить эти два прерывающих сценария.

con = new SqlConnection(Constants.ConnectionString);
con.Open();

SqlCommand comp = new SqlCommand("INSERT INTO table2 (EPC, identificationcount, RSSI) SELECT EPC, identificationcount, RSSI FROM table1 WHERE NOT EXISTS (SELECT 1 FROM table3 WHERE table1.EPC = table3.EPC)", con);
comp.ExecuteNonQuery();
con.Close();

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете создавать представления, используя соединение с таблицами 1 и 3 Я использую переменную таблицы, поэтому перед именем таблицы стоит символ @. Вы можете опустить символ @, если вы используете реальные таблицы.

DECLARE @Table1 TABLE (RFID INT)
DECLARE @Table3 TABLE (RFID INT)

INSERT @Table1 VALUES (1), (2), (3), (4), (5)
INSERT @Table3 VALUES (1), (1), (1), (2), (2), (5), (6), (6)

-- only missing RFID in Table3
SELECT T1.*
FROM @Table1 T1 LEFT JOIN @Table3 T3 ON T1.RFID = T3.RFID
WHERE T3.RFID IS NULL

-- missing RFID in both tables
SELECT DISTINCT T1.*, T3.*
FROM @Table1 T1 FULL OUTER JOIN @Table3 T3 ON T1.RFID = T3.RFID
WHERE T3.RFID IS NULL OR T1.RFID IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...