MySQL:不在,子选择未按预期工作?
这是我的疑问:MySQL:不在,子选择未按预期工作?,mysql,subquery,Mysql,Subquery,这是我的疑问: SELECT customer_email FROM sales_flat_order WHERE customer_email NOT IN (SELECT customer_email FROM sales_flat_order WHERE status != 'holded'); 对于我的测试客户电子邮件test@example.com,
SELECT customer_email
FROM sales_flat_order
WHERE customer_email NOT IN (SELECT customer_email
FROM sales_flat_order
WHERE status != 'holded');
对于我的测试客户电子邮件
test@example.com,该邮件没有其他状态。由于某些原因,完整查询不返回匹配项。当我像那样手动填写NOT IN时,它工作了,我得到了我的3行:
SELECT customer_email
FROM sales_flat_order
WHERE customer_email NOT IN ('whatever', 'foobar', '123@456.com');
那么我做错了什么
小提琴:
小提琴的工作原理和预期的一样,虽然我的表要大得多,但列的类型是相同的
谢谢 我将假设在
销售平面订单中至少有一条记录满足条件状态!='持有“
且其客户电子邮件
为NULL
中的(NOT)在中使用NULL
s是出了名的棘手,下面是一个例子
考虑以下查询:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
这将产生一个值为1
的记录,正如预期的那样
但是,如果将其更改为:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
然后查询生成一个空结果集。这是
中(NOT)的一个众所周知的问题。因此,通常应避免使用此语法,而应使用(NOT)EXISTS
。上述查询可以重写为:
SELECT 1 a
FROM (SELECT 1 a) t1
WHERE NOT EXISTS (
SELECT 1
FROM (SELECT 2 a UNION ALL SELECT NULL) t2
WHERE t1.a = t2.a
)
对于您的查询:
SELECT customer_email
FROM sales_flat_order s
WHERE NOT EXISTS (
SELECT 1
FROM sales_flat_order s1
WHERE s1.customer_email = s.customer_email AND s.status != 'holded'
);
请看:您应该在这里提供一些示例数据。Fiddle在我的帖子sry中提供。谢谢,您是对的,DB中有空值!这个查询是否明显慢了?@Arnie:不,我不认为比您当前的查询慢。为了提高性能,您需要一个关于销售\u扁平件\u订单(客户\u电子邮件,状态)