限定しりとり

副問合せをいれた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する方法はありますか?

A 回答 (4件)

今回のやつは、


固定値をAとして、インラインテーブルを作るといういみなので、
そこにテーブルBの列を書いたらエラーになりますね。
なら、

select A.*,B.COLC COLC, B.COLD COLD, =======>>★
from
(
select 'AAA' COLA, 'BBB' COLB
) A
left join TABLEB B on B.コード・・・・

では?
「どのテーブルとどのテーブルを外部結合したいか」
をイメージするといいかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご指摘のあった箇所をまとめて最終的に以下のようにすることで
解決いたしました。
-----------------------
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.コード
-----------------------
わかりやすい回答でとても助かりました。
有難うございました。

お礼日時:2007/08/03 11:05

固定値の(仮想)レコードを作ってouter join すればいいということ?


SQLServerだと、Select句にfromは必須じゃないので。

select * from
(
select 'AAA' COLA, 'BBB' COLB ---列別名指定は必須
) A
left join
TABLEB B
on B.コード=8 --<ここにWhere句を書く

というかんじでどうでしょう?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

select * from
(
select 'AAA' COLA, 'BBB' COLB,
B.COLC COLC, B.COLD COLD, =======>>★
) A
left join TABLEB B on B.コード・・・・

というように書いてみましたが、どうしても★の箇所で
「 B.COLCをバインドできませんでした。」というエラーになってしまいます。
外部結合をもう少し調べてみます。有難うございました。

お礼日時:2007/08/02 17:57

ダミーが不可能であれば、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文を実行し結果を確認していますので多分いけるでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/02 16:32

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区とダミーの空レコードを利用すれば可能だと思います。
しかし、生成されるのは単なるゴミレコード。
何か意味がありますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

確認してみましたが、テーブルBから抽出するレコードの件数は、必ず1もしくは0になります。
なので、ダミーでレコードを入れておくことは不可能でした。
焦って投稿したため、情報が少なくて申し訳ありません。

SELECT TOP 1~ という書き方を知らなかったので、勉強になりました。
有難うございます。

お礼日時:2007/08/02 09:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す