Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:不在,子选择未按预期工作?_Mysql_Subquery - Fatal编程技术网

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电子邮件,状态)