我需要在两个表之间运行某种异常报告。
表格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
和scan
表上都创建适当的联接列。