sales_flat_orderに少なくとも1つのレコードがあると仮定します 条件status != 'holded'を満たす そしてそのcustomer_email NULLです 。
(NOT) IN 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) INでよく知られている問題です。 。このため、通常はこの構文を避け、(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'
);