• 締切済み

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

noname#64070
noname#64070
  • MySQL
  • 回答数2
  • ありがとう数1

みんなの回答

回答No.2

多分、無理だと思います。 MySQL 5.1 リファレンスマニュアル 12.2.8.6. EXISTS と NOT EXISTS http://dev.mysql.com/doc/refman/5.1/ja/exists-and-not-exists-subqueries.html 質問文の方は長いので、上記のリファレンスマニュアルの方で解説すると、要はEXISTS述語というのはwhere句の中に記述されているわけですから(いわゆる相関副問い合わせ)、それを取ってしまえば、その条件下でのSelect文が実行出来なくて、結果として期待しているデータが得られないと思います。 そうじゃなくって、ただ単にSelect文を2回実行したいだけでしたら、相関名(ASキーワード)に着目してください。質問文のEXISTSの後ろにあるカッコ内には、T2だけでなく、Tというテーブルの別名が使用されています。それじゃあ、それぞれが実際にはどのテーブル名を利用しているのかを考えれば、すぐ分かるはずです。

参考URL:
http://www.geocities.jp/a1770053/jyoho/db/sql.htm
回答No.1

ストアド・プロシジャ中のSQLを抜き出したのでしょうか? 「EXISTSを境に2つに分解」とは、具体的に何をやりたいのですか?

関連するQ&A

  • Select文のパフォーマンスについて

    Select文のパフォーマンスについて質問です。 (1)select * from table1 where col1='00001' and kbn in (1,2,3,4) (2)select * from table1 where col1='00001' and (kbn = 1 or kbn = 2 or kbn = 3 or kbn = 4) (1)と(2)ではどちらがパフォーマンスがよいのでしょうか? SQLServer2008

  • SQL EXISTS演算子について

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

  • SQL文で困っています。

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

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

  • 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文を作って受注表に登録されていない作業員を表示させようと試してみましたが失敗しました。 作業日、作業開始時間、作業終了時間はフォームを作成してそこで入力します。

  • SQL初心者なので教えてください。

    毎度ここにお世話になっております。 売上詳細という表の中にNOとSYOHIN_CDの列があるとします。 Noは1~10まであり、SYOHIN_NAMEにはNo6の列だけ文字が入っています。 ここで、No1~N5はSHYOHIN_NAMEはNULLで、No6~No10のいずれかのSYOHIN_NAMEに文字が入っている物を検索するにはどうしたらいいでしょう? SELECT * FROM hanbai.売上 AA where EXISTS (select * from hanbai.売上詳細 BB where BB.NO between 1 and 5 and SYOHIN_NAME is null and BB.NO between 6 and 10 and SYOHIN_NAME is not null); 構文間違っているので表示されませんが・・・ちゃんと表示されるSQLを教えてください。お願いします。オラクルです。 説明がおかしくてわかりづらいと思いますが、補足しますのでよろしくおねがいします。

  • SQL文のwhere条件文で使う <> の意味はなんですか

       SELECT * FROM user WHERE date <> 1 SELECT * FROM user WHERE key <> "" ↑の date <> 1 とか key <> "" の <> はどういう意味でしょうか?   

  • SQLのUPDATE文についての質問

    下記のSQLを実行したとき 「ORA-00904: "TBLDKPLNID"."KEIKAKU_SAKUTEI_KBN": 無効な識別子です。」というメッセージが出るのですが、 結合の方法に問題があるのでしょうか? UPDATE TBLDKPLNGBST SET SAGYO_STATUS = '1', USER_ID = 'SYSTEM_JOB' WHERE TBLDKPLNID.KEIKAKU_CASE_NO = TBLDKPLNGBST.KEIKAKU_CASE_NO AND TBLDKPLNID.KEIKAKU_SAKUSEITYU_KBN = '1' AND TBLDKPLNID.KEIKAKU_SAKUTEI_KBN = TBLDKPLNGBST.KEIKAKU_SAKUTEI_KBN AND KEIKAKU_SAKUTEI_KBN = '11111111' AND SAGYO_KOUMOKU_ID = '1111';

  • アクセス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の結果を得られるでしょうか?

  • SQL文なんですが

    select t1.link_no,t1.bunrui_code,t2.bunrui_name,t1.name,t1.url,t1.comment from link t1 inner join bunrui t2 on t1.bunrui_code=t2.bunrui_code and t1.link_no=$link_no これって、どういう処理をしようとしているんでしょうか?このクエリがうまくいってないようなので、次の処理が思ったように動かないんです。自分で作ったものではないので、理解できないでいます。

    • ベストアンサー
    • PHP