我需要在两个表之间运行某种异常报告。
表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)
我是不是错了? 谢谢
答案 0 :(得分:0)
您的查询看起来很好,除了两个表之间的连接条件看起来不对,并且它根据您向我们展示的数据不起作用。试试这个版本:
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
表上创建正确的连接列。