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'
);