SQL文でexistsの使い方がわかりません。

このQ&Aのポイント
  • 受注表の特定の条件に合致しない作業員の氏名を一覧表で表示したい場合、existsとnot existsを使用します。
  • 作業員表の特定の条件に合致する作業員を選択し、その中で受注表に登録されていない作業員を表示させます。
  • 具体的には、受注表の作業日、作業開始時間、作業終了時間と作業員表の作業可能日、作業可能開始時間、作業可能終了時間を比較し、条件に合致しない作業員を表示させます。
回答を見る
  • ベストアンサー

SQL文でexistsの使い方がわかりません。

受注表と作業員表のデータベースをaccessで作りました。 受注表の中には受注CD、作業開始時間、作業終了時間、作業日、作業員1、作業員2のフィールドがあります。 作業員表には氏名、作業可能開始時間、作業可能終了時間 作業可能日のフィールドがあります。 受注表に登録する作業員の氏名を一覧表で表示させたいときはどのようなSQL文を作れば良いのでしょうか? 受注表には作業日が同じで作業開始時間と作業終了時間が重なるものがあり、その場合には先に受注した作業に担当者1か担当者2として登録されている作業員は一覧表に表示させないようにしたいのですがやり方がわかりません。not existsの中が特にわかりません。 select 氏名 from 作業員表 where 作業可能開始時間 <= 1430 and 作業可能終了時間 >= 1530 and 作業可能日=2010/10/1 and not exists (select * from 受注表 where 受注表.作業員1 = 作業員表.氏名 or 受注表.作業員2 = 作業員表.氏名 and 受注表.作業開始時間 <= 1430 and 受注表.作業終了時間 >= 1530 and 受注表.作業日=2010/10/1) 上記のSQL文を作って受注表に登録されていない作業員を表示させようと試してみましたが失敗しました。 作業日、作業開始時間、作業終了時間はフォームを作成してそこで入力します。

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

  • ベストアンサー
  • don9don9
  • ベストアンサー率47% (299/624)
回答No.1

SQLでは、OR条件とAND条件ではAND条件が優先されます。 条件1 OR 条件2 AND 条件3 AND 条件4 AND 条件5 という記述だと「条件1に合う または 条件2,3,4,5に合う」 という意味になってしまいます。 (条件1に合ってさえいれば、条件3,4,5に合っていなくてもよい) これを「条件1または条件2に合う かつ 条件3,4,5に合う」 とする場合は (条件1 OR 条件2) AND 条件3 AND 条件4 AND 条件5 と記述します。 これで「条件1,3,4,5に合う または 条件2,3,4,5に合う」 データを抽出することができます。 質問文の例でいうと >受注表.作業員1 = 作業員表.氏名 or 受注表.作業員2 = 作業員表.氏名 の部分を()でくくればいいのではないかと思います。

a1gdx2s
質問者

お礼

ありがとうございました。 おかげで問題を解決することができました。

関連するQ&A

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

  • SQL EXISTS演算子について

    ------------------------------------------------------- SELECT DISTINCT 商社.商社名 FROM 商社 WHERE NOT EXISTS (SELECT * FROM 商品 WHERE NOT EXISTS (SELECT * FROM 納品 WHERE 納品.商品番号 = 商品.商品番号 AND 納品.商社番号 = 商社.商社番号)) 各テーブルレイアウト 納品([商品番号]、[商社番号]、納品数量) 商品([商品番号]、商品名) 商社([商社番号]、商社名) []は主キー 条件:納品表に行が存在することは、その商品を商社が納品することを意味する。 --------------------------------------------------------- 上記SQLは、「全ての商品を納入する商社の商社名を求める」ものだそうですが、なぜそうなるのか理解できません。 具体的にどういう判定でそうなるのか教えていただけないでしょうか。

  • 【SQL】existsでの商演算

    閲覧ありがとうございます. 現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます. 例として,A,Bと名付けた2つのテーブルを最初に用意します. [テーブル1(名前:机1)] | 番号 |氏名|年齢| 好物 | --------------------------- | 12 | あ | 1 | りんご | | 23 | い | 1 | すいか | | 23 | い | 1 | りんご | | 45 | え | 3 | すいか | | 45 | え | 3 | りんご | [テーブル2(名前:机2)] | 好物 | ---------- | りんご | | すいか | この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました. select 氏名 from 机1 A where exists( select * from 机2 B where A.好物 = B.好物); [求めている結果表示] | 番号 |氏名| ------------- | 23 | い | | 45 | え | [実際に表示された結果] | 番号 |氏名| ------------- | 12 | あ | | 23 | い | | 23 | い | | 45 | え | | 45 | え | 実行すると (1)氏名が重複で表示されてしまう (2)「りんご」のみ好物の「あ」も表示されてしまう という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります. 長文・駄文すみませんでした. まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.

  • DELETE 文とEXISTSの使い方について(Oracle10g)

    DELETE 文とEXISTSの使い方について(Oracle10g) 2つのテーブル(A、B)を外部結合して、B側がNULLとなったレコードを A側から削除する、というDELETE文が作りたいのですが、 EXISTS句を使ってみたもののどうも使い方がわからず苦戦しています。 目的は2つのテーブルを同期させる事で このSQLを実行する時点で、常にA>Bになっています。 目的を達成できるSQLを教えてください。 <削除対象レコードをSELECTするSQL> SELECT * FROM A, B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ; <上をDELETE文にしてみたつもりが、削除0件になってしまうSQL> DELETE FROM A WHERE EXISTS( SELECT 1 FROM B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ) ;

  • ProCOBOL/SQLについて

    ProCOBOLの埋め込みSQLで ...WHERE A = 0 AND EXISTS (SELECT ...) っていうのがあるんですが、"EXISTS"ってどういう意味なんですか? それと"FOR UPDATE OF ..."の意味もわかりません。 教えてくださーい。お願いします。

  • SQL文について

    商品表と注文表から、注文のある商品名を知るためのSQL文で、適切なものはどれか。 商品表(商品番号,商品名,単価) 注文表(注文番号,商品番号,注文数) 答えはこれ↓なんですが、なぜなのか分かりません。 SELECT 商品番号,商品名 FROM 商品表        WHERE EXISTS (SELECT * FROM 注文表 WHERE 商品番号 = 商品表.商品番号)

  • SQL文

    名前、性別、年齢の載っているA表から19歳以下の女性、または26歳以上の女性の名前を抽出するSQL文はSELECT 名前 FROM 表A WHERE 性別=’女’AND 年齢<20 OR 性別=’女’AND 年齢>25 が正解ですが、性別=’女’を1回にして SELECT 名前 FROM 表A WHERE 性別=’女’AND 年齢<20 OR  年齢>25 ではだめでしょうか。教えてください。

  • AccessVBAでSQL文を書いています

    私の環境はOS:Xp      ACCESS2000です。 宜しくお願いします。 タイトルの通りSQL文を書いているんですが、書き方が解りません。 sql = "select 顧客コード from ポイント管理テーブル " sql = sql + " where 顧客コード = '" & Me.顧客コード & "'," sql = sql + " 受注年 = '" & Me.受注年 & "'," sql = sql + " 受注月 = " & Me.受注月 & "," sql = sql + " 受注日 = " & Me.受注日 & "" 初歩的な質問なのですが、上記はどのように記述したらよいのでしょう? ちなみに、顧客コードと受注年がテキスト型 受注月と受注日は数値型としてテーブルに持っています。 よろしくおねがいします。

  • SQL文の副問い合わせについて

    SQLの勉強をし始めて間もありませんが、以下のSQLについて教えてください。 実はこの問題は昭晃堂発行の北川博之先生が書いた「データベースシステム」という本に乗っている問題です。以下のようなデータベースがあります。 部門(_部門番号,部門名) 部品(_部品番号,部品名) 業者(_業者番号,業者名,住所,電話番号) 従業員(_従業員番号,従業員名,氏名,住所,年齢) 供給(_部門番号,_部品番号,_業者番号,単価,数量) _がついているのは主キー この中で、登録されているすべての部品の供給を受けている部門の部門番号を表示するSQLを記せという問題があります。 つまり、部品表の供給テーブルの中の部門番号ごとに、供給テーブルのなかに含まれる部品番号と部品テーブルの部品番号がすべて一致するかを調べるSQLを書かなければならないということです。 まったく歯が立たないので、いろいろと調べた結果、 SELECT DISTINCT 部門番号 FROM 供給 AS 供給1 WHERE NOT EXISTS( SELECT * FROM 部品 WHERE NOT EXISTS( SELECT * FROM 供給 AS 供給2 WHERE 部品.部品番号=供給2.部品番号 AND 供給1.部門番号=供給2.部門番号 )); が正解であるということでした。 しかし、NOT EXISTSが2回も出てくるばかりか、副問い合わせの連続で頭が混乱してよく理解できません。 このSQL文について、具体的にはどのようなことをやっているのでしょうか?教えてください。お願いします。

  • SQLで関係のないテーブルの内容を合体させたい

    SQLでの副問い合わせ(サブクエリ)について教えて下さい。自分の出したい結果が思うように得られず悩んでおります。 結果を得たものをCSVに落としたいわけですが”見え方”ヴィジュアル面に問題があります。 欲しい結果をそれぞれSQLにしますと ≪受注表テーブルから≫ SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ; SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ; ≪入荷表テーブルから≫ SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ; SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ; ≪欲しい結果の見え方≫ 担当 顧客コード 担当 顧客コード 担当 入荷日 担当 入荷日 ── ───── ── ───── ── ─── ── ───── 田中 003 田中 020 田中 20080701 田中 20080630 田中 003 田中 020 田中 20080701 田中 20080630 このように関係のないレコードを横並びにするにはどうしたらよいでしょうか? 使っているDBはOracle10、SQL server、MySQL、HiRDBそれぞれで実行したいのですが・・・ どなたかご教示ください。