OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

テーブルの結合の仕方 MSAccess97→MSSQLServer2000Dev

  • 暇なときにでも
  • 質問No.161637
  • 閲覧数104
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 65% (23/35)

初心者なので初歩的な質問かもしれませんがどうぞよろしくお願いします。
現在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で商品マスタを変更・削除せずに商品明細のレコードを削除できる結合方法はないでしょうか?どなたかよろしくお願いいたします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル12

ベストアンサー率 45% (207/457)

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

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

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

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

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

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

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

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

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

お礼率 65% (23/35)

結合の仕方で解決できるような問題ではないようなので、素直にプログラムの書き換えしていこうと思います。
回答ありがとうございました。
投稿日時 - 2001-11-05 10:04:29
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 45% (207/457)

DELETE文の記述がないので分かりません。 DELETE 売上明細.*,商品マスタ.* FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード WHERE 条件 で削除しているなら両方削除される可能性が大だと思いますが... ところでわざわざ結合(JOIN)して削除しないといけませんか? なお結合して削除なら DE ...続きを読む
DELETE文の記述がないので分かりません。

DELETE 売上明細.*,商品マスタ.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件
で削除しているなら両方削除される可能性が大だと思いますが...

ところでわざわざ結合(JOIN)して削除しないといけませんか?

なお結合して削除なら
DELETE 売上明細.*
FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード
WHERE 条件
なら問題ないかも知れません。

簡単に削除するなら
DELETE *
FROM 売上明細
WHERE 条件

でいいはずですが

はっきり言ってAccessのSQLの動作て普通のSQL文となんか違うて言いたくなるような動きをするので困るのです。
補足コメント
reizi_y

お礼率 65% (23/35)

早速の回答ありがとうございます。
せっかく回答いただきましたのに説明がたりませんで申し訳ありませんでした。

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:18
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ