Как удалить одноранговые записи из двух таблиц? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть две таблицы, подобные этой:

Table1

id      serial_id product_id
59867   152905  10005646
59871   152900  10005646
168832  147721  10005646
220695  147721  10005646

Table2

211399  152900
220248  147721

Я хочу сохранить эти записи:

serial_id
152905
147721 

мой запрос:

SELECT REC.*
FROM Table1 REC
         LEFT JOIN Table2 REM ON REC.serial_id = REM.serial_id
WHERE
   REM.serial_id IS NULL;

но мой запрос возвращает этот результат:

id      serial_id product_id
59867   152905  10005646

, но в первой таблице у меня есть две записи serial_id: 147721 Я хочу проверить эти серийные номера равный и результат должен быть:

id      serial_id product_id
59867   152905  10005646
220695  147721  10005646

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Чтобы получить желаемый результат, вам также нужно посмотреть номер строки каждого серийного идентификатора в обеих таблицах и добавить его к JOIN. Таким образом, вы можете сопоставить каждую отдельную строку в Table1 с одной в Table2 и избежать удаления обеих строк, имеющих serial_id = 147721. Поскольку вы используете MariaDB 10.3, вы можете использовать CTE s и ROW_NUMBER():

WITH T1 AS (
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY serial_id ORDER BY id) AS rn
  FROM Table1
),
T2 AS (
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY serial_id ORDER BY id) AS rn
  FROM Table2
)
SELECT T1.id, T1.serial_id, T1.product_id
FROM T1
LEFT JOIN T2 ON T2.serial_id = T1.serial_id AND T2.rn = T1.rn
WHERE T2.id IS NULL

Выход:

id      serial_id   product_id
220695  147721      10005646
59867   152905      10005646

Демонстрация на dbfiddle

0 голосов
/ 14 марта 2020

Изменение LEFT JOIN на INNER JOIN выполнит эту работу.

SELECT RE C. , REM. FROM TAB1 REC INNER JOIN TAB2 REM ON RE C .serial_id = REM.serial_id;

Когда вы используете LEFT JOIN, а затем добавляете условие REM.serial_id IS NULL, он удалит соответствующие записи, т.е. записи с serial_id 152900 и 147721, как и для записей с serial_id 152905, есть в таблице table2 не найдено подходящей записи, поэтому столбцы таблицы table2 для запроса будут иметь значение null serial_id. Проверьте эту ссылку, в этом первом запросе используется тот, который вы используете, но без предложения where, а во втором - предложенный мной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...