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

WHERE value IS NOT IN(サブクエリ)

    更新: 実行が簡単な場合は、パフォーマンスを向上させるために結合を使用することを優先する必要があります。 結合とサブクエリ

    SQLフィドル

    Select distinct Customer from orders o
    join 
    (
      SELECT distinct Customer as changedname FROM Orders o2 
      join
      (
         Select distinct invoice from Promotions where Coupon='couponA'
      ) t3
      on o2.invoice = t3.invoice      
    ) t2
    on o.customer != t2.changedname;
    

    注:2つの結合されたテーブルは異なる列名を持っている必要があるため、t3の列名customerを変更しました

    説明:

    ビッグデータがある場合、内部クエリまたはサブクエリの使用にはコストがかかります。代わりに結合を使用して、サブクエリを結合に変換する方法を学びましょう

    サブクエリを使用 持っていた:

    Select distinct Customer from orders where customer not in 
    (SELECT distinct Customer FROM Orders where invoice in
    (Select distinct invoice from Promotions where Coupon='couponA'));
    

    サブクエリを結合に変換する

    最初のステップ:

    Select distinct Customer from orders o
    join 
    (
      SELECT distinct Customer as changedname FROM Orders where invoice in
      (Select distinct invoice from Promotions where Coupon='couponA')
    ) t2
    on o.customer != t2.changedname;
    

    2番目のステップ:

    Select distinct Customer from orders o
    join 
    (
      SELECT distinct Customer as changedname FROM Orders o2 where invoice 
      join
      (
         Select distinct invoice from Promotions where Coupon='couponA'
      ) t3
      on o2.invoice = t3.invoice      
    ) t2
    on o.customer != t2.changedname;
    

    これで、多数の行を持つテーブルの場合ははるかに高速になります

    元の回答:

    not inを使用する 。ご覧ください。

    Select distinct Customer from orders where customer not in 
    (SELECT distinct Customer FROM Orders where invoice in
    (Select distinct invoice from Promotions where Coupon='couponA'));
    

    編集 クエリを高速化するためにdistinctを追加しました

    SQLフィドル



    1. .dmpファイル(Oracle)をMySql DBにインポートする方法は?

    2. ARMベースのDebianデバイス用のOracleInstantClient

    3. DATE_FORMAT()の例– MySQL

    4. MySQLで過去1か月のデータを取得する方法