• ベストアンサー

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

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

  • ベストアンサー
回答No.2

>#1どの サブクエリのFROMに、T1を含めてしまうと、非相関サブクエリになり おかしな動作をするはずです。 次のSQLは、最近のオラクルであれば、動作すると思います。 (oracle8.0.xとかだと、動くかどうかちょっとあやしい) 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 where T1.年=T2.年 and T1.個人コード=T2.個人コード and T2.番号=01 and T2.合計1>0 ) なお、このSQLは未検証です。

NYAN99
質問者

お礼

助かりました! 更新出来ました。oracle8i 本当にありがとうございます。(^o^)丿

その他の回答 (1)

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

あまり自信はないのですが、 以下のSQLでいかがでしょうか? UPDATE T1 SET (合計1,合計2) = (SELECT T1.合計1 - T2.金額1, T1.合計1 - T2.金額1 - T1.金額2 FROM T1,T2 WHERE T1.年 = T2.年 AND T1.個人コード = T2.個人コード AND T2.番号 = 01 AND T2.合計1 > 0 AND T2.年 =2003 AND T1.個人コード = 1000 ) WHERE EXISTS (SELECT 1 WHERE T1.年 = T2.年 AND T1.個人コード = T2.個人コード AND T2.番号 = 01 AND T2.合計1 > 0 AND T2.年 =2003 AND T1.個人コード = 1000 );

NYAN99
質問者

お礼

ありがとうございました。 でも下記のエラーが出てしまいます。(oracle8i) ORA-00923: FROMキーワードが指定の位置にありません。

関連するQ&A

  • 意味を教えてください。

    以前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は、どういう意味なのでしょうか? 何が抽出されるのでしょうか?

  • SQLについて

    以下のSQLを実行すると。 SQL実行中に以下のエラーが発生しました。 エラーコード:907 [Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。 というエラーが表示されます。 どこがおかしいでしょうか? SELECT Q1.Pコード, Q1.Qコード, T1.E名称 A名称, T2.E名称 B名称, T3.E名称 C名称, T4.E名称 D名称, FROM ( ( ( ( SELECT Pコード, Qコード, Aコード, Bコード, Cコード, Dコード, FROM 報告書 WHERE Pコード = '0001' AND Qコード = '0001' AND ) Q1 INNER JOIN Eマスタ T1 ON Q1.Aコード = T1.Eコード ) INNER JOIN Eマスタ T2 ON Q1.Bコード = T2.Eコード ) INNER JOIN Eマスタ T3 ON Q1.Cコード = T3.Eコード ) INNER JOIN Eマスタ T4 ON Q1.Dコード = T4.Eコード ORDER BY Pコード, Qコード;

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • Access2007 の SQL文です。

    宜しくお願いします。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 合計金額 =sum(当年予算) where (月度>=開始日) and (月度<=終了日) group by 科目ID; ") これで 実行時エラー '3137': SQL ステートメントの最後には、セミコロン(;)が必要です。 下記のSQL文は実行できました。 これを編集したものです。 DoCmd.RunSQL ("update 予算月別 inner join 予算実績 on 予算月別.科目ID=予算実績.科目ID " _ & " set 金額01 =当年予算 where 月度=開始日 ; ")

  • SQLの構文について

    いつもお世話になります。 Access2000からSQLServer2008Expressにつないでいます。 Accessで以下のクエリを作ると、実行時に「更新可能なクエリであることが必要」 とでます。 UPDATE A INNER JOIN B ON ((A.依頼 = B.依頼) AND (A.枝 = B.枝)) SET A.ロット = B.LOT_NO WHERE (A.ロット IS NULL) AND (B.LOT_NO IS NOT NULL); どう考えても問題ないように思うのですが、問題があるのでしょうね。 どこが問題なのかご教示いただけないでしょうか?

  • クエリにSQL文を書き込みたい

    アクセス2000にてソフト開発しています Q受注グラフというクエリがあります。 データが毎月変化するので、これにVB内に記述したSQL文を書き込みたいのですが、どの様にすれば いいのでしょうか ちなみにSQL文は下記です。 SQL = "SELECT JS.受注年月, JS.部署名, JS.当月受注実績 AS 当月, " & _ "(JY.請負1*10000) AS " & m当月 & ", (JY.請負2*10000) AS " & m翌月 & ", (JY.請負3*10000) AS " & m翌々月 & ", " & _ "FORMAT((JS.受注達成率*100),""###.#"") AS [受注達成率(%)]" & _ "FROM T受注実績集計 AS JS INNER JOIN (T受注予定集計 AS JY INNER JOIN 部署コード AS BC ON JY.部署コード = BC.施工部署コード) " & _ "ON (JY.部署コード = JS.部署コード) AND (JY.実績年月 = JS.受注年月)" & _ "WHERE JS.受注年月 = '" & m実績月 & "'" & _ "ORDER BY BC.部署コード;" 宜しく御願いします

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • 更新クエリで合計金額を入れたい

    アクセスのテーブル1を作成しました。 ID    日付    金額    合計金額 1     6/1     ¥100 2     6/1     ¥200 3     6/2     ¥150 4     6/2     ¥300 (合計金額はカラ) そして、日別の合計を出すクエリ1を作成しました。 SELECT [テーブル1].日付, Sum([テーブル1].金額) AS 金額の合計 FROM テーブル1 GROUP BY [テーブル1].日付; 元のテーブルの合計金額の列に、クエリで表示した金額の合計を更新クエリで入れようとすると、 「 更新可能なクエリであることが必要です。」となります。 更新クエリのSQL文は UPDATE クエリ1 INNER JOIN テーブル1 ON [クエリ1].日付 = [テーブル1].日付 SET [テーブル1].合計金額 = [クエリ1]![金額の合計]; です。 ヘルプの内容の 一対多リレーションシップの '一' 側のフィールドを更新するクエリを実行しようとしました。 読み取り専用で開いているデータベースのクエリで、古い OpenQueryDef メソッドで使用しています。 には該当してないのですが(リレーションシップを組んでないし、四方チリ専用で開いてないし) どうすれば元のテーブルに合計金額を入れられるのでしょうか? 結果的に ID     日付     金額     合計金額 1     6/1     ¥100     300 2     6/1     ¥200     300 3     6/2     ¥150     450 4     6/2     ¥300     450 にしたいです。

  • このSQLのおかしい所は?

    DB2環境です。 SQLを組んでみたのですが、どこかおかしいようでうまく値が とれません。 どこが問題になっているか教えていただけませんか? SELECT * FROM TR0410 r410 INNER JOIN TR0400 r400 ON r410.BILLMNGNO=r400.BILLMNGNO AND r400.DELETEFLG=0 INNER JOIN MR0010 mr10 ON (SELECT r10.BUILDMNGNO FROM TR0010 r10 INNER JOIN TR0410 r410 ON r10.ONKEINO=r410.ONKEINO)=mr10.BUILDMNGNO AND mr10.DELETEFLG=0 INNER JOIN MB0010 mb10 ON (SELECT r10.BUILDMNGNO FROM TR0010 r10 INNER JOIN TR0410 r410 ON r10.ONKEINO=r410.ONKEINO)=mb10.BUILDMNGNO AND mb10.DELETEFLG=0 AND mb10.BUILDTNO=(SELECT MIN(BUILDTNO) FROM MB0010 b10EX WHERE b10EX.BUILDMNGNO=mb10.BUILDMNGNO) INNER JOIN TR0010 r10 ON r410.ONKEINO=r10.ONKEINO AND r410.ONKEISUB=r10.ONKEISUB AND r10.DELETEFLG=0 INNER JOIN TR0100 r100 ON r410.TNKEINO=r100.TNKEINO AND r410.TNKEISUB=r100.TNKEISUB AND r100.DELETEFLG=0 INNER JOIN TR0050 r50 ON r410.ONKEINO=r50.ONKEINO AND r410.ROOMCD=r50.ROOMCD AND r50.DELETEFLG=0 INNER JOIN MR0030 mr30a ON r10.ONCD=mr30a.RESTORINO AND mr30a.DELETEFLG=0 INNER JOIN MR0030 mr30b ON r100.TENANTCD=mr30b.RESTORINO AND mr30b.DELETEFLG=0 WHERE r410.DELETEFLG=0 AND r410.SKYOTKBN=2 AND mr10.TORITENPO=1

  • SQL文のINNER JOIN内での条件付けについて質問です

    SQLの質問です。 先程も質問させて頂いた件(http://okwave.jp/qa4089307.html)に派生した問題なのですが、 Accessのクエリにて SELECT A.*FROM grade_points AS A INNER JOIN [SELECT MAX(enforcement_date) AS MaxDate,grade_id FROM grade_points WHERE (enforcement_date)<=date() GROUP BY grade_id]. AS B ON (A.grade_id = B.grade_id) AND (A.enforcement_date = B.MaxDate); (前回の件のクエリにWHERE (enforcement_date)<=date() の条件を追加しました) というクエリを作ると、SQLを書いた直後の保存前はちゃんと動くのですが、保存後に閉じてから実行しようとすると「入力テーブルまたはクエリ(上記[]内SQL文)が見つかりません」というエラーになってしまいます。 INNER JOIN内のSQLにWhere条件は使えないのでしょうか??保存前は動くので不思議でなりません… お手数ですがどなたかご意見よろしくお願い致します。

専門家に質問してみよう