• ベストアンサー

副問合せをいれたINSERT文で、問合せ結果が無い場合

副問合せをいれたINSERT文で、問合せ結果が無い場合 環境はSQL Server2005です。 テーブルA,テーブルBが存在し、テーブルAにレコード追加する際に一部をテーブルBから抽出して、 INSERTしようとしています。 [SQL文]  INSERT INTO テーブルA(フィールド1, フィールド2, フィールド3,フィールド4・・・)   SELECT 'AAA', 'BBB' ,B.フィールド3, B.フィールド4 ・・・   FROM テーブルB B WHERE ~ この場合、テーブルBにWHEREで指定した条件のレコードが存在しない場合はINSERTされなくなってしまいます。 存在しない場合は、該当のフィールドにはNULLをいれたいのですが、テーブルBからの結果が存在しない場合でも テーブルAにINSERTする方法はありますか?

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

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

今回のやつは、 固定値をAとして、インラインテーブルを作るといういみなので、 そこにテーブルBの列を書いたらエラーになりますね。 なら、 select A.*,B.COLC COLC, B.COLD COLD, =======>>★ from ( select 'AAA' COLA, 'BBB' COLB ) A left join TABLEB B on B.コード・・・・ では? 「どのテーブルとどのテーブルを外部結合したいか」 をイメージするといいかと思います。

norikaru
質問者

お礼

ご回答ありがとうございます。 ご指摘のあった箇所をまとめて最終的に以下のようにすることで 解決いたしました。 ----------------------- INSERT INTO (colA,colB,colC,colD) select A.*,B._colC,B.colD from ( select 'AAA' _colA, 'BBB' _colB ) A left join TABLEB B on B.コード ----------------------- わかりやすい回答でとても助かりました。 有難うございました。

その他の回答 (3)

回答No.3

固定値の(仮想)レコードを作ってouter join すればいいということ? SQLServerだと、Select句にfromは必須じゃないので。 select * from ( select 'AAA' COLA, 'BBB' COLB ---列別名指定は必須 ) A left join TABLEB B on B.コード=8 --<ここにWhere句を書く というかんじでどうでしょう?

norikaru
質問者

お礼

ご回答ありがとうございます。 select * from ( select 'AAA' COLA, 'BBB' COLB, B.COLC COLC, B.COLD COLD, =======>>★ ) A left join TABLEB B on B.コード・・・・ というように書いてみましたが、どうしても★の箇所で 「 B.COLCをバインドできませんでした。」というエラーになってしまいます。 外部結合をもう少し調べてみます。有難うございました。

noname#140971
noname#140971
回答No.2

ダミーが不可能であれば、SQL文を複雑化するしかないです。 例えば、 If (SELECT COUNT(*) from Table2 WHERE 年月日2='2007/08/09')>0 INSERT INTO TABLE1 (ID, 年月日1, 年月日2) SELECT * from Table2 WHERE 年月日2='2007/08/09' ELSE INSERT INTO TABLE1 (ID, 年月日1, 年月日2) Values ('', '', ''); これで、ヒット場合としなかった場合とで異なる値をINSERTします。 SQL SERVER 2000 でこのSQL文を実行し結果を確認していますので多分いけるでしょう。

norikaru
質問者

お礼

できました!! If ~ Else文が使用できるということも知りませんでした。。 有難うございました!!

noname#140971
noname#140971
回答No.1

Q、テーブルAにINSERTする方法はありますか? A、工夫すれば可能ですが・・・。 <Table2> ID____年月日1____年月日2 1_____20070707___2007/07/07 2_____20070707___2007/08/08 3_____20070708___2007/08/10 9999________null_______________null 例えば、[年月日2]を条件節にして一致していれば当該レコードのデータを返す。 仮に、一致していなければ Null を戻させてみます。 最も、単純な仕掛けはダミーレコードを用意すること。 SELECT TOP 1 年月日1,年月日2 from Table2 WHERE 年月日2='2007/08/08' OR ID=9999 ORDER BY 年月日2 DESC; |年月日1 |年月日2 | ---|-------------------- 1|20070707|2007/08/08| SELECT TOP 1 年月日1,年月日2 from Table2 WHERE 年月日2='2007/08/09' OR ID=9999 ORDER BY 年月日2 DESC; |年月日1|年月日2| ---|---------------- 1| | | SELECT 年月日1,年月日2 from Table2 WHERE 年月日2='2007/08/08' OR ID=9999 ORDER BY 年月日2; |年月日1 |年月日2 | ---|-------------------- 1| | | 2|20070707|2007/08/08| こういう事ですから DESC は必要です。 Top区とダミーの空レコードを利用すれば可能だと思います。 しかし、生成されるのは単なるゴミレコード。 何か意味がありますか?

norikaru
質問者

お礼

ご回答ありがとうございます。 確認してみましたが、テーブルBから抽出するレコードの件数は、必ず1もしくは0になります。 なので、ダミーでレコードを入れておくことは不可能でした。 焦って投稿したため、情報が少なくて申し訳ありません。 SELECT TOP 1~ という書き方を知らなかったので、勉強になりました。 有難うございます。

関連するQ&A

  • 副問い合わせのinsert文

    いつもお世話になっています。 insert文の副問い合わせのことでお聞きしたいのですが、 ■通常のinsert文 insert into AAA values(aaa,bbb,ccc); 上記のsqlを副問い合わせにした場合(aaaに別テーブルからの検索結果を入れたい場合)どういうSQL文になるでしょうか。 参考書等を参照すると、副問い合わせの場合はvaluesを省略する(使えない?)と記述がありました。 insert into AAA values ( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); とはできないみたいですので… どうかご教授宜しくお願いします。

  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • INSERT INTO文教えて下さい。Oracle9i

    KEY1,KEY2をもとに、 TableAに存在して、 TableBに存在しないレコードをTableBにINSERTするSQL文 TableA Key1,key2,field1,field2 001,1,1,3 001,1,2,3 003,1,2,3 004,1,2,3 TableB key1,key2,field1,field2 003,1,2,3 004,1,2,3 存在しないレコード 001,1 ↓ これをTableBにINSERTする。 その場合、field1は小さいものを使用する つまり、 001,1,1,3 というレコードを作成する

  • すっきりとしたSQL文にしたいのですが

    Oracle9iにてテーブルのデータを更新しようと思っています。 目的としてはAAAのカラムa1とBBBのカラムb1が同一なレコードである場合、 AAAのa2にBBBのb2を更新したいのですが、 <条件> AAA:テーブル1 BBB:テーブル2 a1:CHAR b1:CHAR a2:VERCHAR b2:VERCHAR すべて必須で桁数は10 UPDATE AAA SET AAA.a2 = ( SELECT BBB.b2 FROM BBB WHERE AAA.a1 = BBB.b1) WHERE AAA.a1 = ( SELECT BBB.b1 FROM BBB WHERE AAA.a1 = BBB.b1) ; いまはこんな無駄の多そうなSQLしか分かりません。 この他にも条件が2つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

  • Insert文で・・・

    失礼します。SQL初心者なので質問します。 Insert into Aテーブル Select X , Y , Z From Bテーブル というSQLがあり、Aテーブルの列数を3から4にした際、AテーブルへのInsertの項目を、BテーブルからSelectされたX,Y,Z以外に普通の変数αも新たに作成した4つめの項目として同時にInsertしたい場合、どのようなSQLにすれば良いでしょうか? Insert into Aテーブル (Select X , Y , Z From Bテーブル),α みたいに都合良くはいきませんよね??

  • Oracl[10g]の SQL文について(No.6)

    何度も恐縮です。前回の質問(例題)が間違えていました。 本当に申し訳ございません。改めて、お願いしたい次第です。 Oracl[10g]の SQL文について、教えて下さい。 [C1]テーブルに [CODE](key) と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE](key) と [NOUKI](key) と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [C2]テーブルに [CODE2](key) と [NAME2] と [CODE] フィールドがあるとします。 内容は、 AAA NAME2-1 A-1 BBB NAME2-2 A-2 CCC NAME2-3 A-3 と、します。 [C3]テーブルに [CODE2](key) と [NO](key) と [KIN2] フィールドがあるとします。 内容は、 AAA 1 200 AAA 2 300 BBB 1 10 BBB 2 20 BBB 3 30 と、します。 結果が、 A-1 NAME-1 300[B]テーブルの合計 500[C3]テーブルの合計 A-2 NAME-2 1200[B]テーブルの合計 60[C3]テーブルの合計 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? 前回、教えて頂いた例を参考に頑張っているのですが、 まだ、私には難しすぎる様です。 よろしくお願い致します。

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • select句副問い合わせ 値の個数が多すぎます

    SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'