- ベストアンサー
副問合せをいれた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する方法はありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
今回のやつは、 固定値をAとして、インラインテーブルを作るといういみなので、 そこにテーブルBの列を書いたらエラーになりますね。 なら、 select A.*,B.COLC COLC, B.COLD COLD, =======>>★ from ( select 'AAA' COLA, 'BBB' COLB ) A left join TABLEB B on B.コード・・・・ では? 「どのテーブルとどのテーブルを外部結合したいか」 をイメージするといいかと思います。
その他の回答 (3)
- khazad-lefty
- ベストアンサー率44% (296/668)
固定値の(仮想)レコードを作ってouter join すればいいということ? SQLServerだと、Select句にfromは必須じゃないので。 select * from ( select 'AAA' COLA, 'BBB' COLB ---列別名指定は必須 ) A left join TABLEB B on B.コード=8 --<ここにWhere句を書く というかんじでどうでしょう?
お礼
ご回答ありがとうございます。 select * from ( select 'AAA' COLA, 'BBB' COLB, B.COLC COLC, B.COLD COLD, =======>>★ ) A left join TABLEB B on B.コード・・・・ というように書いてみましたが、どうしても★の箇所で 「 B.COLCをバインドできませんでした。」というエラーになってしまいます。 外部結合をもう少し調べてみます。有難うございました。
ダミーが不可能であれば、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文を実行し結果を確認していますので多分いけるでしょう。
お礼
できました!! If ~ Else文が使用できるということも知りませんでした。。 有難うございました!!
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区とダミーの空レコードを利用すれば可能だと思います。 しかし、生成されるのは単なるゴミレコード。 何か意味がありますか?
お礼
ご回答ありがとうございます。 確認してみましたが、テーブルBから抽出するレコードの件数は、必ず1もしくは0になります。 なので、ダミーでレコードを入れておくことは不可能でした。 焦って投稿したため、情報が少なくて申し訳ありません。 SELECT TOP 1~ という書き方を知らなかったので、勉強になりました。 有難うございます。
お礼
ご回答ありがとうございます。 ご指摘のあった箇所をまとめて最終的に以下のようにすることで 解決いたしました。 ----------------------- 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.コード ----------------------- わかりやすい回答でとても助かりました。 有難うございました。