• 締切済み

意味を教えてください。

以前SQLのアドバイスを頂いたのですが、 (つい締め切ってしまったので・・) その書き方で質問したいのです。Oracle8i update T1 set (合計1,合計2) = ( select T1.合計1 - T2.金額1, T1.合計2 - T2.金額1 - T1.金額2 from T2 where T1.年=T2.年 and T1.個人コード=T2.個人コード and T2.番号=01 and T2.合計1>0 ) where (T1.年,T1.個人コード) in ((2003,1000)) and exists ( select 1 from T2 ・・・(1) where T1.年=T2.年 and T1.個人コード=T2.個人コード and T2.番号=01 and T2.合計1>0 ) このSQLはどういう順番で動くのでしょうか? 特に(1)のSelect 1は、どういう意味なのでしょうか? 何が抽出されるのでしょうか?

みんなの回答

回答No.2

失礼!! ちょい間違い・・・。 >>特に(1)のSelect 1は、どういう意味なのでしょうか? >>何が抽出されるのでしょうか? 1です・・・。

回答No.1

こんにちは。 順番? 普通にサブクエリーの結果でUPDATEしてるだけですが・・・。 >>特に(1)のSelect 1は、どういう意味なのでしょうか? >>何が抽出されるのでしょうか? T2テーブルの1カラム目です。 existsなので何でもいいわけで・・・、とりあえず1番目を出してます。

関連するQ&A

  • SQLを教えてください。

    アクセスの更新クエリーだと動くのですが、 これをオラクルのSQLで動くようにしたいのですが・・ UPDATE文難しくて・・どう書けばいいのでしょうか 更新クエリーです。↓ UPDATE T1 INNER JOIN T2 ON (T1.年 = T2.年) AND (T1.個人コード = T2.個人コード) SET T1.合計1 = [T1]![合計1]-[T2]![金額1], T1.合計2 = [T1]![合計1]-[T2]![金額1]-[T1]![金額2] WHERE (((T2.番号)=01) AND ((T2.合計1)>0) AND ((T2.年)=2003) AND ((T1.個人コード)=1000));

  • 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の知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • RE: [Excel ADO]未登録データの抽出法

    以前質問した内容↓で、一旦解決したかに思えたのですが http://okwave.jp/qa/q9185441.html Set CN = New ADODB.Connection CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties='Excel 8.0;HDR=YES'" CN.CursorLocation = adUseClient Sql = "SELECT * FROM T_訪問者 WHERE NOT EXISTS " & _ "( SELECT * FROM T_名簿 WHERE T_名簿.登録者名 = T_訪問者.訪問者名 )" Set RS = CN.Execute(Sql) Debug.Print RS.RecordCount 以上のようなコード(疑似です)で、 未登録データがないにもかかわらず、RS.RecordCountが1を返す場合があります Sql = "SELECT COUNT(*) FROM T_訪問者 WHERE NOT EXISTS " & _ "( SELECT * FROM T_名簿 WHERE T_名簿.登録者名 = T_訪問者.訪問者名 )" として、件数を出した場合も同様です。 RS.fields(0)などはNULLのままで何も入っていません 未登録データがある場合の抽出は全く問題ないのですが、 抽出数が0(登録済みデータだけ)なら通常処理、といきたいのに うまくいかず困っています。 何が悪いのでしょうか。

  • 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でGROUP項目を列表示する方法?

    SQLでGROUP後の結果を列で効率よく取得する方法を教えてください。(Oracle8.1.7) 現状は下記SQLで列表示していますが、あまり良い方法ではないと思います。別の取得方法があれば教えてください。 ○出力したい結果 担当CD1 4月金額 5月金額 担当CD2 4月金額 5月金額 ○現状SQL問題点 ・一応取得可能ですがこれだと月数分毎回GROUPするので時間が勿体無いと思います。 ・T1で4月~5月を範囲でGROUP後、その結果を4月分、5月分と抽出だけしたいのですが可能でしょうか? ・もっと他に効率よい取得方法があれば教えてください。 ○現状のSQL内容 (SELECT A.TANTOCD, T1.KIN1 KINGAKU1, T2.KIN2 KINGAKU2 FROM (SELECT YYMM,TANTOCD FROM TBL WHERE YYMM >= 200204 AND YYMM <= 200205 GROUP BY YYMM,TANTOCD ) A, (SELECT YYMM,TANTOCD,SUM(KIN) KIN1 FROM TBL WHERE YYMM ='200204' GROUP BY YYMM,TANTOCD) T1, (SELECT YYMM,TANTOCD,SUM(KIN) KIN2 FROM TBL WHERE YYMM ='200205' GROUP BY YYMM,TANTOCD) T2 WHERE A.TANTOCD = T1.TANTOCD(+) AND A.TANTOCD = T2.TANTOCD(+));

  • EXSIST述語を使った副問合わせについて

    SELECT HINMOKU_NAME FROM HINMOKU WHERE HINMOKU_CODE IN (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE = '2004-11-10'); 上記をSQL文をEXISTS述語を使って書き換えると エラーが出てしまい、うまく書き換えがすることが できません。下記にエラーがでるSQL文を記載いたします。 SELECT HINMOKU_NAME FROM HINMOKU WHERE EXISTS (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE ='2004-11-10' WHERE HINMOKU.HINMOKU_CODE=URIAGE.HINMOKU_CODE); 上記SQL文についてどこに問題があるのか、ご教授お願い致します。

  • 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文の違いにどのような問題があるのでしょうか?よろしくお願いします。

  • 平成20年 春期 基本情報技術者 午前 問58 の解説

    平成20年 春期 基本情報技術者 午前 問58 の問題の解説をお願い致したく思っております。 どうしても、なぜ『エ』が不正解なのか、分かりません。 宜しくお願い致します。 ---------- 問58 “社員”表から,職務がプログラマである社員が5人未満の部署の部署コードを探すSQL文として,適切なものはどれか。ここで,“社員”表は次の構造であり,各列にはナル値は含まれないものとする。 社員(社員番号,社員名,部署コード,職務) ア SELECT DISTINCT 部署コード FROM 社員 S1   WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員 S2         WHERE S1.部署コード = S2.部署コード         AND S2.職務 = 'プログラマ') イ SELECT DISTINCT 部署コード FROM 社員 S1   WHERE 5 < (SELECT COUNT(S2.社員番号) FROM 社員 S2         WHERE S1.部署コード = S2.部署コード         AND S2.職務 <> 'プログラマ') ウ SELECT DISTINCT 部署コード FROM 社員 S1   WHERE EXISTS (SELECT * FROM 社員 S2         WHERE S1.部署コード = S2.部署コード         AND S2.職務 = 'プログラマ')   GROUP BY S1.部署コード HAVING COUNT(*) < 5 エ SELECT DISTINCT 部署コード FROM 社員 S1   WHERE S1.部署コード IN (SELECT S2.部署コード FROM 社員 S2         WHERE S1.部署コード = S2.部署コード         AND S2.職務 = 'プログラマ'         GROUP BY S2.部署コード HAVING COUNT(*) < 5)