
副問合せをいれた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.コード・・・・
では?
「どのテーブルとどのテーブルを外部結合したいか」
をイメージするといいかと思います。
ご回答ありがとうございます。
ご指摘のあった箇所をまとめて最終的に以下のようにすることで
解決いたしました。
-----------------------
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.コード
-----------------------
わかりやすい回答でとても助かりました。
有難うございました。
No.3
- 回答日時:
固定値の(仮想)レコードを作って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をバインドできませんでした。」というエラーになってしまいます。
外部結合をもう少し調べてみます。有難うございました。
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文を実行し結果を確認していますので多分いけるでしょう。
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区とダミーの空レコードを利用すれば可能だと思います。
しかし、生成されるのは単なるゴミレコード。
何か意味がありますか?
ご回答ありがとうございます。
確認してみましたが、テーブルBから抽出するレコードの件数は、必ず1もしくは0になります。
なので、ダミーでレコードを入れておくことは不可能でした。
焦って投稿したため、情報が少なくて申し訳ありません。
SELECT TOP 1~ という書き方を知らなかったので、勉強になりました。
有難うございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブルの値をテキス...
-
ACCESS検索★ある文字を複数のフ...
-
Accessで、固定アルファベット+...
-
主キーはオートナンバー型のID...
-
SQLServer2005のSQL文での別名...
-
accessのレポートで元になるテ...
-
ACCESS レーダーチャートのデー...
-
Access⇒エクセルへのエク...
-
電話番号のデータの書式を変換...
-
ExcelのデータをAccessのテーブ...
-
Accessのフィールド数が255しか...
-
アクセス エラーを数値「0」に...
-
Accessで、フィールドにルック...
-
Access 昇順・降順で並び替え...
-
Accessで連続データってできま...
-
ACCESSでテーブルのフィールド...
-
ODBC--リンクテーブル'XXXX'で...
-
ACCESSでオートナンバーを任意...
-
INSERT INTO ステートメントに...
-
【Access】フォームで自動計算...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INSERT INTO ステートメントに...
-
ACCESSで400以上のフィールドが...
-
Accessのフィールド数が255しか...
-
Accessでテーブルの値をテキス...
-
SQLServer2005のSQL文での別名...
-
ACCESSでの改行コード
-
ExcelのデータをコピーでACCESS...
-
Access 昇順・降順で並び替え...
-
Accessで、固定アルファベット+...
-
accessのレポートで元になるテ...
-
【Access】フォームで自動計算...
-
アクセス エラーを数値「0」に...
-
Access:リンクテーブルマネー...
-
主キーはオートナンバー型のID...
-
ファイルメーカーでCountifの様...
-
アクセス A列コピー B列貼り...
-
アクセス メモ型 255文字...
-
ACCESSでテーブルのチェックを...
-
ACCESS検索★ある文字を複数のフ...
-
ACCESSで和暦を西暦に・・・
おすすめ情報