NOT IN子查询改写成LEFT JOIN查询 订货单表结构
CREATE TABLE `customer_order` (
`customer_order_id` int(11) NOT NULL,
`customer_order_no` varchar(32) NOT NULL,
`create_time` datetime(6) NOT NULL
) ENGINE=InnoDB
订货单表数据
+-------------------+-------------------+----------------------------+
| customer_order_id | customer_order_no | create_time |
+-------------------+-------------------+----------------------------+
| 1001 | DH-20231031-0001 | 2023-10-31 15:44:33.000000 |
| 1002 | DH-20231031-0002 | 2023-10-31 15:44:48.000000 |
| 1003 | DH-20231031-0003 | 2023-10-31 15:44:59.000000 |
| 1004 | DH-20231031-0004 | 2023-10-31 15:45:13.000000 |
| 1005 | DH-20231031-0005 | 2023-10-31 15:45:20.000000 |
| 1006 | DH-20231031-0006 | 2023-10-31 15:45:27.000000 |
| 1007 | DH-20231031-0007 | 2023-10-31 15:45:33.000000 |
| 1008 | DH-20231031-0008 | 2023-10-31 15:45:38.000000 |
| 1009 | DH-20231031-0009 | 2023-10-31 15:45:44.000000 |
| 1010 | DH-20231031-0010 | 2023-10-31 15:45:51.000000 |
+-------------------+-------------------+----------------------------+
SQL语句
SELECT i1.*
FROM customer_order i1
LEFT JOIN
(
SELECT customer_order_id
FROM customer_order
WHERE create_time < '2023-10-31 15:45:27'
AND create_time > '2023-10-31 15:45:13'
) AS i2 ON i1.customer_order_id = i2.customer_order_id
WHERE i2.customer_order_id IS NULL
本质与单表 NOT IN 一样 发货单表结构
CREATE TABLE `send_order` (
`send_order_id` int(11) NOT NULL,
`customer_order_id` int(11) NOT NULL,
`send_order_no` varchar(32) NOT NULL,
`create_time` datetime(6) NOT NULL
) ENGINE=InnoDB
发货单表数据
---------------+-------------------+------------------+----------------------------+
| send_order_id | customer_order_id | send_order_no | create_time |
+---------------+-------------------+------------------+----------------------------+
| 2001 | 1003 | FH-20231102-0001 | 2023-10-31 15:48:54.000000 |
| 2002 | 1005 | FH-20231102-0002 | 2023-10-31 15:49:10.000000 |
+---------------+-------------------+------------------+----------------------------+
SQL语句
SELECT i1.*
FROM customer_order i1
LEFT JOIN
(
SELECT customer_order_id
FROM send_order
WHERE create_time > '1990-10-31 15:45:27'
) AS i2 ON i1.customer_order_id = i2.customer_order_id
WHERE i2.customer_order_id IS NULL