プロが教えるわが家の防犯対策術!

初心者なので初歩的な質問かもしれませんがどうぞよろしくお願いします。
現在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で商品マスタを変更・削除せずに商品明細のレコードを削除できる結合方法はないでしょうか?どなたかよろしくお願いいたします。

A 回答 (2件)

あっやっぱりADOを使ってレコードセットの行を削除している。


No1の回答したあと気づいたのだけど確認と思って補足していなかったのだけど、レコードセットをそのままグリッドで表示して選択行を削除だと

DELETE 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件

と同じような動きをするので「DELETE 売上明細.*,品目マスタ.* ・・・」という事は売上明細の全カラムを削除しなさいまた、品目マスタの全カラムを削除しなさい。

条件はレコードセットの削除行に依存

となるはずですので両方のテーブルからデータが消えたのでしょう。

レコードセットで削除させず、素直にSQL文で削除した方が良いのではと思うのです。

ADOを使ったプログラムは現状使っていないので詳しくはパス(その手詳しい人に任せます。)

>ということはいままでのような動作をすることがおかしかったということみたいですね。プログラムの書き換えを考えたほうがいいみたいですね。

私の過去投稿この回答の二つ下の回答でも普通なら出来るはずの機能が出来なかったのでちょっと工夫しています。(条件にInを使った)
癖が強いようで動作確認をしないと思っていない現象になることがあります。
    • good
    • 0
この回答へのお礼

結合の仕方で解決できるような問題ではないようなので、素直にプログラムの書き換えしていこうと思います。
回答ありがとうございました。

お礼日時:2001/11/05 10:04

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文となんか違うて言いたくなるような動きをするので困るのです。

ということはいままでのような動作をすることがおかしかったということみたいですね。プログラムの書き換えを考えたほうがいいみたいですね。

補足日時:2001/11/02 12:35
    • good
    • 0

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

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