Not Exists の絞込みについて

このQ&Aのポイント
  • SQLServer2005 Express にて、指定の条件での絞込みがうまくいかない問題が発生しました。
  • 問題のSQL文では、T_Customer テーブルからカ行のKana読みのデータを抽出するために、T_ABC テーブルに存在しないデータを絞り込もうとしています。
  • SQL初学者であるため、解決策を教えていただけると幸いです。
回答を見る
  • ベストアンサー

Not Exists の絞込みについて

SQLServer2005 Express にて次のようなSQLをVB.NET2005で発行しようとしたらうまくいきません SELECT CustomerID,CustomerName FROM T_Customer WHERE Kana LIKE N'カ%' OR Kana LIKE N'キ%' OR Kana LIKE N'ク%' OR Kana LIKE N'ケ%' OR Kana LIKE N'コ%' AND not exists(select 1 from T_ABC where T_Customer.CustomerID=T_ABC.CustomerID 目的はT_ABCテーブルにあるデータ以外のデータの中からカ行のKana読みの データのみを抽出するものです SQL初学者でお恥ずかしい限りですがよろしくご教授ください

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

ANDはORよりも優先されるので、括弧でくくる必要がありますね。 SELECT CustomerID,CustomerName FROM T_Customer WHERE (Kana LIKE N'カ%' OR Kana LIKE N'キ%' OR Kana LIKE N'ク%' OR Kana LIKE N'ケ%' OR Kana LIKE N'コ%') AND not exists (select 1 from T_ABC where T_Customer.CustomerID=T_ABC.CustomerID)

sakaki_san
質問者

お礼

早速のアドバイスありがとうございます 上記の通り実行したら期待通りの動作をしました 演算子の優先順位や括弧など基本的な文法について 今一度再学習してみます 情報の洪水で溺れていました(笑) ありがとうございました

関連するQ&A

  • NOT INをNOT EXISTSで書き直したい

    こんにちは。SQLでNOT INが実行速度が遅いため、EXISTSで書き直したいのですが、思っている結果がでません。 SQLのどこが間違っているかお教え頂けませんでしょうか? ■ ・テーブル名:R_TABLE ・フィールド:id データ: id(ユニークではない) 001 002 003 003 003 007 008 009 ■ ・テーブル名:P_Master ・フィールド:id データ: id(ユニーク) 001 002 003 ■やりたい事 R_TABLEのデータを条件によって削除したい。 条件はP_MASTERに無いR_TABLEの行を削除したいです。 ■欲しい結果 R_TABLE 001 002 003 003 003 ■書いたSQL DELETE FROM R_TABLE WHERE R_TABLE.id NOT IN (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) これは正しい結果がでました。 書きなおしたSQL DELETE FROM R_TABLE WHERE R_TABLE.id WHERE NOT EXISTS (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) 結果はR_TABLEから何も消されていませんでした。 どこを修正すれば正しい結果が得られるでしょうか? 副問い合わせで、R_TABLEとP_MASTERのINNER JOINの結果が得られ、R_TABLEからINNER JOINに含まれないデータ削除しろという命令だと思っていたのですが違うみたいです。 どこを修正すればよろしいでしょうか? よろしくお願いします。

  • アクセス2010 EXISTSの使い方

    テーブルA F1 F2 あい False いえ True おか True きく True けこ False テーブルB F1 あ か け TB1にTB2が含まれるデータを抽出して テーブルC F1 あい けこ をつくりたい。 DoCmd.RunSQL "INSERT INTO テーブルC (F1) " + _ "SELECT F1 From テーブルA " + _ "Where F2=False And " + _ "EXISTS (SELECT * FROM テーブルB WHERE テーブルA.F1 Like '*テーブルB.F1*' );" としたのですが、追加件数は「0」です。 Likeの使い方が悪いのか、EXISTSが悪いのか? どのようにしたらTB3の結果を得られるでしょうか?

  • IEで、implodeが Bad arguments になります。

    配列で次のページに[POST]で渡して[implode] でセレクト文に入れようとしていますが IEではキチンと入ってくれません。*fireFox safari では、何も問題はありません。 IEはどのバージョンも同じです。 環境です CENTOS 5 Mysql 5.0.45 MySQL の文字セット: UTF-8 Unicode (utf8) PHP 5.0 HTML,PHPは UTF-8 で書いています。 クエリの前に print_r($mailID); とすると 1,2,3,4,5,6,7,8 と表示しますが print $sql; で調べると  SELECT * FROM customer WHERE customerID IN (); 同じ事をfireFox safari ですると SELECT * FROM customer WHERE customerID IN (1,2,3,4,5,6,7,8); クエリは下記の用に書いています。 $sql = "SELECT * FROM customer WHERE customerID IN (".implode(",",$mailid).");"; 何が問題なのでしょうか? この現象を改善する(IEでも表示する)、若しくは別の方法は無いでしょうか。。 分かる方、教えて頂けませんか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 五十音順

    テーブルのフィールドに、読み仮名が入っています。 あ行、か行など、五十音順に抽出する場合のSQL文ですが、 $sql = 'select * from テーブル名 where kana between "あ" and "お" order by kana'; 上記の文を $sql = 'select * from テーブル名 where kana between "$key[$i]" order by kana'; という具合に配列などに入れたいと考えておりますが。 そのようなことは可能なのでしょうか? それとも、もっと効率よく五十音順の検索ができるようにする方法が ありますでしょうか?

  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • SQLでNOT INと!=ALLの違い

    現在、仕事で使用する機会がありそうなのでOracleでSQLを勉強しています。 ある教本の練習問題をしていて気になったので質問させてください。 単純な受注に関するデータベースの問題です。 CUSTOMER_TとSLIP_Tというテーブルがあり、 CUSTOMER_Tは顧客コード、顧客の名前、顧客の住所が載っています。 SLIP_Tは受注番号、発注した顧客の顧客コード、受注した日が載っています。 2007年1月10日以降に受注したことのない顧客の名前を出力する問題なのですが私は以下のように解答しました。 SELECT CUST_NAME FROM CUSTOMER_T WHERE CUST_CODE != ALL(SELECT CUST_CODE FROM SLIP_T WHERE SLIP_DATE >= '2007-1-10'); しかし解答は以下でした。 SELECT CUST_NAME FROM CUSTOMER_T WHERE CUST_CODE NOT IN(SELECT CUST_CODE FROM SLIP_T WHERE SLIP_DATE >= '2007-1-10'); 自分で簡単なデータベースを作り試してみたのですが出力結果は同じになりました。 この二つのSQL文の違いにどのような問題があるのでしょうか?よろしくお願いします。

  • EXISTSについて

    以下のようにしているのですが取得できるデータは1回目のselectのみで2回目のデータが 何度やっても取得できません。 $sql1 = 'SELECT //ここのデータは取得できてます。 products_id, name, products_flag, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new FROM products WHERE EXISTS ( SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, stock FROM products_class_detail WHERE //1回目のselectで取得したproducts_idを基準に問い合わせ products_class_detail.products_id = products.products_id ) //ここはproductsに存在するフィールドです。 AND status1 = ? AND status2 = ? AND del_flg = ? ORDER BY RAND()'; マニュアルも見てみたのですが取得できない原因がわからない状態におります。 どうすれば取得可能になるでしょうか?宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文のEXISTSについて

    DBはmysql5.0を使っています。 以下のSQL文を、EXISTSを境に2つに分解することはできないでしょうか?? SELECT ROUND(SUM(IFNULL(T.DAIKIN,0) - IFNULL(T.TESURYO,0))/10000,1) INTO v_PRICE2 FROM TORIHIKI AS T WHERE T.TORIHIKI_KBN = '1' AND EXISTS (SELECT * FROM TORIHIKI AS T2 WHERE T2.TORIHIKI_DATE >= F_DATE AND T2.TORIHIKI_DATE <= T_DATE AND T2.TORIHIKI_KBN = '2' AND T2.KEHAI_CD = LPAD(v_SOBA_CD,5,'0') AND T2.KAIIN_SBT = v_KAIIN AND T.SEIRI_NO = T2.SEIRI_NO AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) >= p_MIN AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) < p_MAX );

  • Oracle8での外部結合

    現在、oracle8.1.7で開発しています。 T1,T2,T3の3つのテーブルがあります。 T1のデータで、T3のテーブルにまだデータが存在しないものを検索しています。 それは既にできました。 次に、条件として、  (1)T1のA,B,Cと一致し、かつFLGが5または9  (2)T1のA,B,Cと一致するデータがない。 という2点を追加しました。 しかし、以下のようにFLGが1となっているものまで検索してしまいます。   <T1>        <T2>      <T3> A:あいうえお     A:あいうえお    データ無し B:bbb        B:bbb C:ccc        C:ccc             FLG:1   ===SQL文============================================================== SELECT A,DT1,DT2 FROM T1 WHERE A LIKE 'あ%' ---追加部分---- AND ( EXISTS (SELECT A FROM T2 WHERE A=T1.A AND B=T1.B AND C=T1.C AND FLG IN (5,9)) OR NOT EXISTS (SELECT A FROM T2 WHERE A=T1.A AND B=T1.B AND C=T1.C ) ) ----ここまで---- AND NOT EXISTS (SELECT * FROM T3 WHERE KATAMEI='あ' AND NO=1) どこがいけないのでしょうか? よろしくお願いしますm(_ _)m

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。