Мне нужно запустить какой-то отчет об исключении между двумя таблицами.
Таблица 1
Авторизоваться
Таблица 2 Сканирование
Теперь для входа в таблицу ящики регистрируются в системе с отдельной порцией, но в программе "Сканирование" она объединяет поле и пакет.
Я пытаюсь выяснить, какие ящики не были отсканированы, но были зарегистрированы.
Поэтому я написал сценарий ниже, но не дал мне правильного ответа, поскольку в результате ящики регистрируются и проверяются. Странная причина??
SELECT distinct CONCAT_WS('-', box, batch) As box
FROM login a
WHERE a.profid = '46'
and dt between '2018/01/01 00:00:01am' and '2018/05/25 23:59:59 PM'
AND NOT EXISTS (SELECT 1
FROM scan b
WHERE b.profid = '6'
AND a.box = b.boxname)
Если я ошибаюсь? Спасибо
Ваш запрос выглядит в основном ОК, за исключением того, что условие соединения между двумя таблицами выглядит неправильно, и оно не будет работать на основе данных, которые вы нам показали. Попробуйте эту версию:
SELECT DISTINCT CONCAT_WS('-', box, batch) AS box
FROM login a
WHERE
a.profid = '46' AND
dt >= '2018-01-01' AND dt < '2018-05-26' AND
NOT EXISTS (SELECT 1 FROM scan b
WHERE b.profid = '6' AND b.boxname LIKE CONCAT('%', a.box, '%'));
Критическое изменение, которое я сделал, это добавить следующее условие в подзапрос EXISTS
:
b.boxname LIKE CONCAT('%', a.box, '%')
Это имеет смысл, если, например, вы пытались сопоставить поле DSDEN182
с именем коробки DSDEN182-BATCHG77899M
.
Замечание: хотя вышеприведенный запрос может работать и разблокировать вас на данный момент, условие соединения использует как LIKE
и конкатенацию строк. Это очень дорогое сравнение. Для лучшей долгосрочной эффективности рассмотрите возможность создания соответствующих столбцов соединения как login
таблиц login
в login
и для scan
.