sql >> データベース >  >> RDS >> Mysql

MySQL:サブセレクトが期待どおりに機能しない状態ではありませんか?

    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
    )
    

    DBフィドルのデモ

    クエリの場合:

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



    1. DBMSとは何ですか? –データベース管理システムの包括的なガイド

    2. jdbc:mysqlnetbeansに適したドライバが見つかりません。*。jarがライブラリに含まれています

    3. Oracleの明示カーソルと暗黙カーソルの違いは何ですか?

    4. パラメータ変数で Like を使用しますか?