初心者なので初歩的な質問かもしれませんがどうぞよろしくお願いします。
現在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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- その他(買い物・ショッピング) JANコードの登録について 1 2022/07/23 14:19
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文で、合計が0のレコードを...
-
EXISTSを使ったDELETE文
-
AccessVBA データのエクスポート
-
Accessの実行時エラーについて
-
アクセスにて月末日付を取得し...
-
異なるデータベース間のテーブ...
-
Access2000で、支払残金額を算...
-
最大値を含むレコードの抽出
-
関数について。
-
差し込み後、元データを変更し...
-
外部参照してるキーを主キーに...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
SQLで特定の項目の重複のみを排...
-
for whichの使い方
-
datetime型でNULL値を入れたい。
-
前置可能な語句を含む複数の修...
-
INSERT文でフィールドの1つだ...
-
速度が低下し無効になったアド...
-
SQLサーバから、項目の属性(型...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
日付により変動する「単価」を...
-
異なるデータベース間のテーブ...
-
前月の取得について
-
アクセス フィールド名に変数...
-
ACCESSでクエリ作成時複数のフ...
-
DBが複雑すぎる
-
ACCESS 商品毎の最新の単価を設...
-
最大値を含むレコードの抽出
-
Access2013で商品に複数の単価...
-
アクセスにて月末日付を取得し...
-
ACCESSでDLookUpすると、不正な...
-
Excel VBA ADODB
-
フィールドの数値を四捨五入の...
-
Excelのユーザーフォームで別の...
-
店舗での日報での良い例を教え...
-
SQLserverでのUPDATE文について
おすすめ情報