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

このQ&Aのポイント
  • MSAccess97のDBをMSSQLServer2000に移行し、結合方法について質問
  • 現在MSAccess97のDBをVB6sp4で操作しており、MSSQLServer2000に移行しようと考えている
  • 結合方法を変更すると商品マスタの内容が削除されてしまう問題が発生している
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.2

あっやっぱりADOを使ってレコードセットの行を削除している。 No1の回答したあと気づいたのだけど確認と思って補足していなかったのだけど、レコードセットをそのままグリッドで表示して選択行を削除だと DELETE 売上明細.*,商品マスタ.* FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード WHERE 条件 と同じような動きをするので「DELETE 売上明細.*,品目マスタ.* ・・・」という事は売上明細の全カラムを削除しなさいまた、品目マスタの全カラムを削除しなさい。 条件はレコードセットの削除行に依存 となるはずですので両方のテーブルからデータが消えたのでしょう。 レコードセットで削除させず、素直にSQL文で削除した方が良いのではと思うのです。 ADOを使ったプログラムは現状使っていないので詳しくはパス(その手詳しい人に任せます。) >ということはいままでのような動作をすることがおかしかったということみたいですね。プログラムの書き換えを考えたほうがいいみたいですね。 私の過去投稿この回答の二つ下の回答でも普通なら出来るはずの機能が出来なかったのでちょっと工夫しています。(条件にInを使った) 癖が強いようで動作確認をしないと思っていない現象になることがあります。

reizi_y
質問者

お礼

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

その他の回答 (1)

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

DELETE文の記述がないので分かりません。 DELETE 売上明細.*,商品マスタ.* FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード WHERE 条件 で削除しているなら両方削除される可能性が大だと思いますが... ところでわざわざ結合(JOIN)して削除しないといけませんか? なお結合して削除なら DELETE 売上明細.* FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード WHERE 条件 なら問題ないかも知れません。 簡単に削除するなら DELETE * FROM 売上明細 WHERE 条件 でいいはずですが はっきり言ってAccessのSQLの動作て普通のSQL文となんか違うて言いたくなるような動きをするので困るのです。

reizi_y
質問者

補足

早速の回答ありがとうございます。 せっかく回答いただきましたのに説明がたりませんで申し訳ありませんでした。 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

  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • テーブルの結合について

    テーブル結合に関するSQL文について質問させてもらいます。 DBはSQLServer2005です。 下記のような二つのテーブルがあります。 テーブルA コード A111 A111B A222 A333 テーブルB コード    数量  A111     1 A111B    2 A222     3 A222B    4 上記2つのテーブルから下記の結果を表示させたいのです。 コード    数量  A111     1 A111B    2 A222     7 A333     0 テーブルBのコードがテーブルAにある場合、そのまま数量を表示。 ない場合、コードの4桁目まででサマリした合計値を表示させたい。 LEFT JOIN等をいろいろためしてみたのですがうまくいきません。 おわかりの方、方教えてください。    

  • 違うDB間のテーブル結合について

    宜しくお願い致します。 同じDB内にあるテーブル同士はleft join等で結合できますが、違うDB間にあるテーブルを結合する事は可能でしょうか?

    • ベストアンサー
    • MySQL
  • 仕様が難しくてSQL文が作れません(新人プログラマ

    予約明細テーブルと貸出明細テーブルの2つがあります。 この2つのテーブルから以下の項目を抽出するSQL文がわかりません 貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先 ※予約明細と貸出明細には貸出期間開始日と貸出期間終了日があります。 貸出期間:上記明細の貸出期間(貸出先で抽出した貸出期間開始日、貸出期間終了日) 会場:予約明細の時のみ上記明細の会場 担当 上記明細の登録担当者 という項目を抽出するSQL文がわかりません 自分なりに考えた結果が以下のSQL文です。新人プログラマのため間違っていると思うので ご指摘願います。 SELECT 貸出先, 貸出期間開始日~貸出期間終了日 AS 貸出期間, 会場, 担当 FROM 商品 LEFT JOIN 予約明細 ON 商品コード = 商品コード (商品テーブルと予約明細テーブルは商品コードで結合します) LEFT JOIN 貸出明細 ON 商品コード = 商品コード (商品テーブルと貸出明細テーブルは商品コードで結合します) WHERE ここからがまったくわかりません。 SQL文だけでは抽出する事は不可能なのでしょうか VB.netで開発しているのですがVB側で処理しなければいけない 項目もありますでしょうか SQL文(とVB)のコードでのご回答宜しくお願いいたします。 環境 VB2005 SQLServer2005

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • 複数のテーブルを外部結合する

    複数のテーブルを外部結合してSUMをとってきたいとき、SQLServerではどのような結合にすればよいのでしょう。 一対一の関係なら「LEFT JOIN」を使って「FROM テーブルA LEFT JOIN テーブルB ON テーブルA.フィールド = テーブルB.フィールド」ができますが、一対複数の関係で書き方がよくわからず、かなり困っています。 例) ユーザーマスター ・ユーザーID ・ユーザー氏名 ○月売上テーブル←○には1~12が入る ・ユーザーID ・売上金額 欲しいデータは ・ユーザーID ・ユーザー氏名 ・SUM(1月売上テーブル.売上金額) 1月 ・SUM(2月売上テーブル.売上金額) 2月 ・SUM(3月売上テーブル.売上金額) 3月 以降、12月まで続く ORACLEだと↓のやり方で、 ・ユーザーマスターはすべて ・各月の売上テーブルはユーザーID毎に集計(外部結合) を出力してくれるのですが…。 SELECT u.ユーザーID,u.ユーザー氏名, SUM(m1.売上金額),SUM(m2.売上金額),SUM(m3.売上金額),,, FROM ユーザーマスター u, 1月売上テーブル m1, 2月売上テーブル m2, 3月売上テーブル m3,,, WHERE u.ユーザーID=m1.ユーザーID(+) AND u.ユーザーID=m2.ユーザーID(+) AND u.ユーザーID=m3.ユーザーID(+),,, GROUP BY u.ユーザーID,u.ユーザー氏名 ORDER BY u.ユーザーID,u.ユーザー氏名

  • SQLの結合

    SQLの結合を行う際にwhereで結合する場合とfromないでleft joinなどで結合を行う場合ではどちらのほうが処理が早いのでしょうか?

  • 2つのテーブルをLIKE演算子のように結合させたい

    こんにちは DB2 ver 8.1 fixPak5 VB6 にて開発を行っております。 TABLEa の NAMAEa KANKEIa TABLEb の ADANAb FLAG というテーブルがあるとします そしてそれぞれのテーブルに TABLEa のNAMAEa に '山田' TABLEb のADANAb に '山' というデータがはいっていたとき この2つのデータをLIKE演算子のように結合させたいのですが、どのようにしたらいいのでしょうか。 イメージとしては SELECT NAMAEa, KANKEIa, FLAG FROM TABLEa LEFT OUTER JOIN TABLEb ON NAMAEa LIKE ADANAb% 伝わるでしょうか・・・ できたら1つのSQL文で完結させたいです。 駄目だったらRecordSetにもたせて処理しようかと思いますが、 今後の為にも何か方法があるのでしたら教えてください。

  • 同じ構成のテーブルを結合する

    AとBという全く同じ列構成からなるテーブルの結合を考えています。 イメージとしては、Aのレコードが全て表示された下にBのレコードが列挙されるような感じです。 "INNER JOIN"、"LEFT OUTER JOIN"で行った結果、AとBでキーに同じ値を持つと、どちらかの値で上書きされてしまうみたいなのでイメージ通りにはいきませんでした。また、"CROSS JOIN"ではAの右側にBの内容が追加されてしまうのもあって、イメージ通りにできませんでした。 どなたかこのSQL文が分かる方はお教えいただけないでしょうか? よろしくお願いします。 データベース:SQL Server