初心者なので初歩的な質問かもしれませんがどうぞよろしくお願いします。
現在MSAccess97(Win2K)のDBをVB6sp4(Win2K)で操作しておりますが、
MSAccess97のDBをMSSQLServer2000に移行しようと考えておりましてクエリー(VBで作成したクライアント内のSQL文)での記述のしかたについて質問したいのですが、下記のように○売上明細テーブルと○商品マスタが存在していて
いままで(Access)は
SELECT 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード;
で結合して追加・削除・更新などしておりました。
商品マスタの内容は変更・削除しないで売上明細のほうは削除できました。
移行(MSSQLServer)しようとSQL文を書き直し
SELECT 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード;
として(SQLServerのDBを)削除すると商品マスタのほうまで削除されてしまいます。SQLServerのViewで直接削除してみても同じでした。
+-----+-------+--+----+-------+
|商品コード| 商品名 |単価| 数量 | 金 額 |
+-----+-------+--+----+-------+
|00001 | |50 | 20 | 1,000 |
↑
ここに設定する項目が売上明細にないので
商品マスタから参照したい(参照のみで更新・削除はしない)
SQLServerで商品マスタを変更・削除せずに商品明細のレコードを削除できる結合方法はないでしょうか?どなたかよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
あっやっぱりADOを使ってレコードセットの行を削除している。
No1の回答したあと気づいたのだけど確認と思って補足していなかったのだけど、レコードセットをそのままグリッドで表示して選択行を削除だと
DELETE 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件
と同じような動きをするので「DELETE 売上明細.*,品目マスタ.* ・・・」という事は売上明細の全カラムを削除しなさいまた、品目マスタの全カラムを削除しなさい。
条件はレコードセットの削除行に依存
となるはずですので両方のテーブルからデータが消えたのでしょう。
レコードセットで削除させず、素直にSQL文で削除した方が良いのではと思うのです。
ADOを使ったプログラムは現状使っていないので詳しくはパス(その手詳しい人に任せます。)
>ということはいままでのような動作をすることがおかしかったということみたいですね。プログラムの書き換えを考えたほうがいいみたいですね。
私の過去投稿この回答の二つ下の回答でも普通なら出来るはずの機能が出来なかったのでちょっと工夫しています。(条件にInを使った)
癖が強いようで動作確認をしないと思っていない現象になることがあります。
結合の仕方で解決できるような問題ではないようなので、素直にプログラムの書き換えしていこうと思います。
回答ありがとうございました。
No.1
- 回答日時:
DELETE文の記述がないので分かりません。
DELETE 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件
で削除しているなら両方削除される可能性が大だと思いますが...
ところでわざわざ結合(JOIN)して削除しないといけませんか?
なお結合して削除なら
DELETE 売上明細.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件
なら問題ないかも知れません。
簡単に削除するなら
DELETE *
FROM 売上明細
WHERE 条件
でいいはずですが
はっきり言ってAccessのSQLの動作て普通のSQL文となんか違うて言いたくなるような動きをするので困るのです。
この回答への補足
早速の回答ありがとうございます。
せっかく回答いただきましたのに説明がたりませんで申し訳ありませんでした。
VB上のデータグリッドに表示して、データグリッドをクリックしてレコードを選択、削除ボタンで削除というふうに使っております。
Private Sub Form_Load()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL as String
strSQL="SELECT 売上明細.*,商品マスタ.* " _
& "FROM 売上明細 LEFT OUTER JOIN 商品マスタ " _
& "ON 売上明細.商品コード = 商品マスタ.商品コード"
Set rs = New ADODB.Recordset
rs.Open strSQL , cn , adOpenStatic , adLockOptimistic
DataGrid1.DataSource=rs
End Sub
Private Sub 削除ボタン_Click()'削除ボタンを押したときの処理
rs.Delete
rs.MoveNext
End Sub
>はっきり言ってAccessのSQLの動作て普通のSQL文となんか違うて言いたくなるような動きをするので困るのです。
ということはいままでのような動作をすることがおかしかったということみたいですね。プログラムの書き換えを考えたほうがいいみたいですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
日付により変動する「単価」を...
-
クエリフォームからのレコード...
-
差し込み後、元データを変更し...
-
エクセルで最後の文字だけ置き...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
カーソル0件の時にエラーを発生...
-
for whichの使い方
-
count集計の結果が0の場合でも...
-
バッチでcsvファイルの指定のカ...
-
Accessで処理経過を表示したい...
-
日本語のエイリアスは" "で囲...
-
SQLで特定の項目の重複のみを排...
-
重複していないレコードの抽出...
-
英語ができる方、問題をお願い...
-
INSERT文でフィールドの1つだ...
-
no other~について
-
SQLにて特定の文字を除いた検索...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
異なるデータベース間のテーブ...
-
ACCESS 商品毎の最新の単価を設...
-
Accessの不一致クエリについて
-
アクセス フィールド名に変数...
-
日付により変動する「単価」を...
-
Accessのテーブル構成について
-
ACCESSでクエリ作成時複数のフ...
-
Excel VBA ADODB
-
前月の取得について
-
テーブル名の トラン マスタ...
-
フィールドの数値を四捨五入の...
-
Access2000で、支払残金額を算...
-
ACCESSでDLookUpすると、不正な...
-
サブクエリの書き方
-
ACCESSのマスタの変更について
-
アクセスのフォーム上でのルッ...
おすすめ情報