SQL MARGE 使用方法 ORACLE

このQ&Aのポイント
  • ORACLE10gを使用してMARGE文を作成しています。セレクト対象となるUSER_MASTER_IMPORTの変わりにサブクエリを使用したい場合はどうすればよいでしょうか?
  • MARGEしたいサブクエリのVIEWを作成すればよいのでしょうか?
  • ご教示いただきたく存じます。
回答を見る
  • ベストアンサー

SQL MARGE 使用方法 ORACLE

はじめましてよろしくお願いします。 ORACLE10gを使用してMARGE文を作成しています。 そこで質問なのですが、下記はサイトで拾ったサンプル文なのですがUSING~で使用している セレクト対象となるUSER_MASTER_IMPORTの変わりにサブクエリを使用したい場合はどうすればよいでしょうか? MARGEしたいサブクエリのVIEWを作成すればよいのでしょうか? <SAMPLE> MERGE INTO USER_MASTER USING USER_MASTER_IMPORT ON ( USER_MASTER.USER_ID = USER_MASTER_IMPORT.USER_ID) -- 既存レコードの更新 WHEN MATCHED THEN UPDATE SET USER_NAME = USER_MASTER_IMPORT.USER_NAME, DEPT_NO = USER_MASTER_IMPORT.DEPT_NO, MODIFIED_ON = SYSDATE -- 新規レコードの作成 WHEN NOT MATCHED THEN INSERT ( USER_ID, USER_NAME, DEPT_NO ) VALUES ( USER_MASTER_IMPORT.USER_ID, USER_MASTER_IMPORT.USER_NAME || '(新人)', USER_MASTER_IMPORT.DEPT_NO ) 識者の方がいればご教示いただきたく存じます。 よろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

インラインビュー(サブクエリ)を作り別名を付ければ通りますよ。

anman0201
質問者

お礼

ご回答ありがとうございます。 USING (SELECT * FROM DUAL) TEST_A ON()~ の形で成功しました。 ありがとうございました。

関連するQ&A

  • MERGE文について

    お世話になります。 oracleのMERGE文で アンマッチ時のインサート文にSELECTで 引いた値を入れたいのですが、 ORA-00926エラーになってしまいます。 MERGEのインサート文にSELECTは使えないのでしょうか? 尚、INSERT文単体ではエラーなく挿入できます。 以上、よろしくお願いいたします。 以下、SQLです。 MERGE INTO USER_MASTER UM USING USER_MASTER_IMPORT UI ON ( UM.USER_ID = UI.USER_ID) -- 既存レコードの更新 WHEN MATCHED THEN UPDATE SET USER_NAME = USER_MASTER_IMPORT.USER_NAME -- 新規レコードの作成 WHEN NOT MATCHED THEN INSERT ( USER_ID, USER_NAME, NO ,SHOZOKU_NAME) SELECT UI.USER_ID, UI.USER_NAME, UI.NO, SH.SHOZOKU_NAME FROM USER_MASTER_IMPORT UI LEFT JOIN SHOZOKU SH ON(UI.USER_ID = SH.USER_ID)

  • SQLの書き方について

    (1)の様なテーブルから結果を(2)の様にしたいのですが どのようなSQLを書いたら表示できるのかわかりません。 アドバイスなどをお願い致します。 (新たにView等を作成するなどでもかまいません。) (1)dept_id / item_id / day / time (カラム) 1111 / 0001 / 20090101 / 60 (レコード1) 1111 / 0001 / 20090102 / 30 (レコード2) 1111 / 0002 / 20090101 / 40 (レコード3) 1112 / 0001 / 20090101 / 30 (レコード4) (2)dept_id / item_id / time1 / time2 1111 / 0001 / 60 / 30 1111 / 0002 / 40 / 1112 / 0001 / 30 /

  • sql merge文について

    該当KEY=12345が存在すれば、seqに1を加算、存在しない場合は、seqに1を設定する mergeを使用したsql文を作成したいのですが、 良いサンプルはありませんか? ↓こんな雰囲気でしょうか? MERGE INTO A表 ab USING (SELECT KEY FROM A表 where KEY = 12345 ) ac ON (ab.KEY = ac.KEY) WHEN MATCHED THEN UPDATE SET ac.SEQ = ac.SEQ +1 WHEN NOT MATCHED THEN INSERT (KEY, SEQ) VALUES ("12345",1) よろしくお願いします

  • MERGE文を単体テーブルに対して行いたい

    Oracle初心者です。 宜しくお願い致します。 MERGE文を1つのテーブルに対して行いたいのですが、エラーになってしまいます。 すみませんが、教えて下さい。 MERGE INTO TEST A USING TEST B ON (A.SEQ_NO = B.SEQ_NO AND A.SEQ_NO2 = B.SEQ_NO2 AND A.SEQ_NO3 = B.SEQ_NO3) WHEN MATCHED THEN UPDATE文 WHEN NOT MATCHED THEN    INSERT文;

  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • SQLでのCASEの使い方

    ASPからSQLを実行し、DBを操作するプログラムを組んでいます。 SQLをクエリアナライザで実行したときに→のところでエラーが出るのですが、どのようにしたらいいでしょうか? ----------------------------------------------- if object_id('xxxx') is not null  drop procedure xxxx go CREATE PROCEDURE xxxx (  @client_id char(10),  @user_id  char(10),   :(省略)  @code_1  char(6) output,  @code_2  char(6) output,   :(省略)  @code_9  char(6) output ) AS BEGIN  SET NOCOUNT ON  BEGIN TRANSACTION    DECLARE @no     int  SELECT @no = '0'  WHILE (@no <= 9)  BEGIN   SELECT @AAA = ISNULL(MAX job_code), '000000')    FROM TABLE    WHERE client_id = @client_id     And user_id = @user_id    SET @AAA = dbo.fbx_NextAlphanumeric(@AAA)   :(省略)   :   CASE @no →正しくない構文    WHEN 0 THEN SELECT @code_1 = @AAA    WHEN 1 THEN SELECT @code_2 = @AAA →正しくない構文     :(省略)    WHEN 9 THEN SELECT @code_9 = @AAA   END   SELECT @no = @no + 1  END  COMMIT TRANSACTION  RETURN 1 END go ----------------------------------------------- やりたいのは、SQL実行後にOUTPUTする変数「@code_1~9」にWHILEでループしながら求めた変数@AAAをセットしたいのですが。 初歩的なことだとは思いますが、よろしくお願いします。

  • 2つのテーブルを結合する条件

    現在、MySQLを使用しており2つのテーブルの結合条件がわからないので教えてください。 name_masterとmeiboの2つのテーブルがあります。 meiboとname_masterを結合させてname_idとname_id2が日本語に置き換わった状態で 取得させたいと思っています。どのようにwhere句の条件を作成すればよいでしょうか。 取得する項目のイメージとしては以下の3つが取得できるようにしたいです。 「meibo.no, meibo.name_idの日本語, meibo.name_id2の日本語」 【name_masterテーブル】 id name 1  ポチ 2  タマ 3  ミケ 4  ハチ 5  タロウ 【meiboテーブル】 no  name_id  name_id2 1    3     1 2    4     2 3    5     3

    • ベストアンサー
    • MySQL
  • SQLで抽出可能でしょうか?

    SQLで抽出可能でしょうか? Javaでツールを作成しています。 開発環境はjava 1.4、oracle 10gです。 処理の中にデータベースからレコードを取得する箇所があります。 10,000件のデータを保持する社員テーブル(syain_tbl)から 社員番号(syain_no)をキーに社員名(syain_name)を取得します。 現時点で作成したSELECT句は以下のとおりです。 select syain_no, syain_name from syain_tbl where syain_no in ('0001','0002','0003') 仮に'0001'と'0003'のレコードがあり、'0002'のレコードがない場合の結果は syain_no syain_name 0001 テスト太郎 0003 テスト三郎 となります。 ですが、実現したいことは 「条件に指定した社員番号のレコードがなかったとしても、結果として取得したい」です。 つまり求めたい結果としては syain_no syain_name 0001 テスト太郎 0002 (null) 0003 テスト三郎 です。 一時表を作成して外部結合させればうまくいきそうですが、 できればDDLなしで実現させたいです。 上記のSELECT句を修正して結果を求めることは可能でしょうか? (WHERE句にある社員番号をIN条件にしている箇所は、 一度に複数件のレコードを取得したいので変更はできません)

  • merge intoについて

    merge into contact A using contact_vw B on (A.postID = B.postID) when matched then update set A.postID = B.postID when not matched then insert values (B.postID, B.postID) 行1でエラーが発生しました。: ORA-00947: 値の個数が不足しています merge intoについて詳しく書いてあるサイト探しています。 よろしくお願いします。

  • 凝ったSQL文なのですが・・・

    下記SQLを教えてください。 テーブル構成は(基本的には)変更不可という前提でお願いいたします。 以下のような会員テーブルがあります。 ユーザID毎に、入会日、退会予定日が登録されており、 ユーザID+履歴No.でプライマリとします。 このテーブルは、月に一度、退会手続きのなかった会員に対して、 自動で新規レコード追加します(継続手続)。 ある期間休んだ後、再入会の場合も手動で新規レコード追加されます。 ステータスは有効(1)/無効(0)の判定です。 no user_id start_day end_day status ---------------------------------------- 1 aaa 2002/12/01 2002/12/31 0 2 aaa 2003/01/01 2003/01/31 0 3 bbb 2003/01/01 2003/01/31 0 4 aaa 2003/02/01 2003/02/28 1 5 bbb 2003/02/02 2003/02/28 1 6 ccc 2003/02/01 2003/02/28 1 とデータが入っている場合に、 新規登録ユーザ(No.6)および 再入会ユーザ(No.5)をえらびたいのです。 あるユーザが自動継続かどうかの判定は、 status=1のレコードのend_dayと そのひとつ古いレコードのend_dayが連続していることです。 よろしくお願いいたします。