Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


505 / 2272 ツリー ←次へ | 前へ→

【11343】クエリ結果件数が違う pon 10/1/5(火) 14:32 質問[未読]
【11345】Re:クエリ結果件数が違う 小僧 10/1/5(火) 17:45 回答[未読]
【11350】Re:クエリ結果件数が違う pon 10/1/6(水) 15:56 質問[未読]
【11353】Re:クエリ結果件数が違う pon 10/1/6(水) 17:37 発言[未読]
【11354】Re:クエリ結果件数が違う 小僧 10/1/6(水) 17:53 回答[未読]
【11378】Re:クエリ結果件数が違う pon 10/1/13(水) 17:40 質問[未読]
【11380】Re:クエリ結果件数が違う 小僧 10/1/13(水) 18:02 回答[未読]
【11407】Re:クエリ結果件数が違う pon 10/1/21(木) 17:30 お礼[未読]

【11343】クエリ結果件数が違う
質問  pon  - 10/1/5(火) 14:32 -

引用なし
パスワード
   こんにちは
よろしくお願い致します

XP、2003


アクセス一応使えるつもりです
ADPまだ良くわかりません
SQLサーバー ADPからのぞけるぐらいです

下記わかりにくいと思いますがよろしくお願い致します

ADPの操作は怖いのでMDBで試そうと
MDBにTBLをインポート
ADPのクエリは、外部DB参照のSQLがあってうまく動作しなかったので
手動でMDBに作成しました

ADPのクエリ結果のレコード件数が117,820件
MDBでのクエリ結果が初回117,818件でした
なぜだかわからなかったので
もう一度ADP、MDBのクエリをデザインで見比べてみましたが
構造に違いはありませんでした
で試しに、もう一度MDBのクエリを実行すると
レコード件数が117,819件でした
??と思って、何度も再実行してみましたが
117,819件で、117,818件は見間違えかと思いました

上記は昨日です
で、今日、

参照している各TBLのレコード件数や
クエリから参照しているクエリのレコード件数を
確認してみましたが
不具合の発生するクエリ以外は全て同じレコード件数でした

その後そのクエリをもう一度試すとレコード件数は117,820件!!

昨日の結果はなんっだんだろう、が取合えず良かった

再度試すと 117,818件
??
再度試すと 117,819件
再度試すと 117,819件
再度試すと 117,819件

で、別のマシンBで試してみましたが
こちらは、117,819件でした


マシンC vista、2007で試してみました
初回 117,818件
2回目 117,820件
3回目 117,820件となりました
ちなみにADPは毎度 117,820件となります

そこで、マシンBで
リンクTBLをインポートし自MDB内で試してみましたが
レコード件数は 117,819件でした

その後
マシンBにて元のMDBで試行して見ましたが
1度  117,820件がありましたが
他は 117,819件でした

最後に上記MDBの最適化を実行して見ましたが
その結果は
一回目117,819件でした
二回目117,820件でした
三回目117,819件でした

不具合クエリは
クエリ    Q03JOB仕リ
です

何かアドバイス有りましたらよろしくお願い致します


構造は
JOB.mdb        
リンクTBL    LTタイプ    9
リンクTBL    LT仕様    228
リンクTBL    LT単位    142
リンクTBL    LT部位    145
リンクTBL    LT名    153
自TBL    T単価    117820
クエリ    Q01仕様    228
クエリ    Q02JOBリ    117820
クエリ    Q03JOB仕リ    117819
        
マスタ.mdb        
自TBL    LTタイプ    9
自TBL    LT仕様    228
自TBL    LT単位    142
自TBL    LT部位    145
自TBL    LT名    153

クエリ    Q01仕様
SELECT LT仕様.*, [仕区C]*1000+[仕様C] AS tmp
FROM LT仕様;

クエリ    Q02JOBリ
SELECT T単価.*, 1000+[仕様C1] AS S1, 2000+[仕様C2] AS S2,
3000+[仕様C3] AS S3, 4000+[仕様C4] AS S4, 5000+[仕様C5] AS S5,
6000+[仕様C6] AS S6, 7000+[仕様C7] AS S7
FROM T単価;

クエリ    Q03JOB仕リ
SELECT Q02JOBリ.*,
Q01仕様.名称, Q01仕様_1.名称, Q01仕様_2.名称, Q01仕様_3.名称,
Q01仕様_4.名称, Q01仕様_5.名称, Q01仕様_6.名称
FROM (((((((((Q02JOBリ LEFT JOIN LT部位
ON Q02JOBリ.部C = LT部位.部C) LEFT JOIN LT名
ON (Q02JOBリ.区C = LT名.区C) AND (Q02JOBリ.工種3C = LT名.工種3C)
AND (Q02JOBリ.工種2C = LT名.工種2C) AND (Q02JOBリ.工種1C = LT名.工種1C))
LEFT JOIN LT単位 ON Q02JOBリ.単位C = LT単位.単位C)
LEFT JOIN Q01仕様 ON (Q02JOBリ.S1 = Q01仕様.tmp)
AND (Q02JOBリ.工種1C = Q01仕様.工種C)) LEFT JOIN Q01仕様 AS Q01仕様_1
ON (Q02JOBリ.S2 = Q01仕様_1.tmp) AND (Q02JOBリ.工種1C = Q01仕様_1.工種C))
LEFT JOIN Q01仕様 AS Q01仕様_2 ON (Q02JOBリ.S3 = Q01仕様_2.tmp)
AND (Q02JOBリ.工種1C = Q01仕様_2.工種C)) LEFT JOIN Q01仕様 AS Q01仕様_3
ON (Q02JOBリ.S4 = Q01仕様_3.tmp) AND (Q02JOBリ.工種1C = Q01仕様_3.工種C))
LEFT JOIN Q01仕様 AS Q01仕様_4 ON (Q02JOBリ.S5 = Q01仕様_4.tmp)
AND (Q02JOBリ.工種1C = Q01仕様_4.工種C)) LEFT JOIN Q01仕様 AS Q01仕様_5
ON (Q02JOBリ.S6 = Q01仕様_5.tmp) AND (Q02JOBリ.工種1C = Q01仕様_5.工種C))
LEFT JOIN Q01仕様 AS Q01仕様_6 ON (Q02JOBリ.S7 = Q01仕様_6.tmp)
AND (Q02JOBリ.工種1C = Q01仕様_6.工種C);

【11345】Re:クエリ結果件数が違う
回答  小僧  - 10/1/5(火) 17:45 -

引用なし
パスワード
   ▼pon さん:
こんにちは。

>ADPのクエリ結果のレコード件数が117,820件

SQLを見る限りですが
T単価テーブルとの左外部結合を行っているだけなので
結果は必ずT単価テーブルのレコード数と一致しなければいけないですよね。

こういったレコード件数の多いMDBのテストとして
郵政公社が提供している郵便番号データを使う事があるのですが
12万を超える件数でも pon さんの様な事象にあった事がありません。
(仕事柄、スペックの高いマシンを使っていますが…)


根本的な解決ではないのですが気になる点として、
クエリの中でクエリを呼び出している箇所があるので
そちらを纏めてみたら結果はどうなりますでしょうか。


SELECT T単価.*
,T1.名称
,T2.名称
,T3.名称
,T4.名称
,T5.名称
,T6.名称
,T7.名称
FROM ((((((((((T単価
LEFT JOIN LT部位
    ON T単価.部C = LT部位.部C)
   LEFT JOIN LT単位
    ON T単価.単位C = LT単位.単位C)
   LEFT JOIN LT名
    ON T単価.区C = LT名.区C
      AND T単価.工種1C = LT名.工種1C
      AND T単価.工種2C = LT名.工種2C
      AND T単価.工種3C = LT名.工種3C)
   LEFT JOIN LT仕様 AS T1
      ON [T単価].[仕様C1] + 1000 = [T1].[仕区C]*1000+[T1].[仕様C]
     AND [T単価].[工種1C] = [T1].[工種C])
   LEFT JOIN LT仕様 AS T2
      ON [T単価].[仕様C2] + 2000 = [T2].[仕区C]*1000+[T2].[仕様C]
     AND [T単価].[工種1C] = [T2].[工種C])
   LEFT JOIN LT仕様 AS T3
      ON [T単価].[仕様C2] + 2000 = [T3].[仕区C]*1000+[T3].[仕様C]
     AND [T単価].[工種1C] = [T3].[工種C])
   LEFT JOIN LT仕様 AS T4
      ON [T単価].[仕様C2] + 2000 = [T4].[仕区C]*1000+[T4].[仕様C]
     AND [T単価].[工種1C] = [T4].[工種C])
   LEFT JOIN LT仕様 AS T5
      ON [T単価].[仕様C2] + 2000 = [T5].[仕区C]*1000+[T5].[仕様C]
     AND [T単価].[工種1C] = [T5].[工種C])
   LEFT JOIN LT仕様 AS T6
      ON [T単価].[仕様C2] + 2000 = [T6].[仕区C]*1000+[T6].[仕様C]
     AND [T単価].[工種1C] = [T6].[工種C])
   LEFT JOIN LT仕様 AS T7
      ON [T単価].[仕様C2] + 2000 = [T7].[仕区C]*1000+[T7].[仕様C]
     AND [T単価].[工種1C] = [T7].[工種C])


>何かアドバイス有りましたらよろしくお願い致します

既に出来上がってしまっている
データベースに対しては難しいのですが

>> 名称 仕様C1 仕様C2 仕様C3
>> AAA   100   200   300   

のようなデータの持ち方でなく、

>> 名称 仕様 データ
>> AAA  C1   100
>> AAA  C2   200
>> AAA  C3   300

の様に正規化をすると色々改善されるかもしれませんね。

【11350】Re:クエリ結果件数が違う
質問  pon  - 10/1/6(水) 15:56 -

引用なし
パスワード
   ▼小僧 さん:
ありがとうございます

>SQLを見る限りですが
>T単価テーブルとの左外部結合を行っているだけなので
>結果は必ずT単価テーブルのレコード数と一致しなければいけないですよね。
ですね

ご指摘を受けて下記確認してみました

仕様1-7をはずしたクエリでは
SELECT T単価.*
FROM ((T単価
  LEFT JOIN LT部位
    ON T単価.部C = LT部位.部C)
  LEFT JOIN LT単位
    ON T単価.単位C = LT単位.単位C)
  LEFT JOIN LT名
    ON T単価.区C = LT名.区C
    AND T単価.工種1C=LT名.工種1C
    AND T単価.工種2C=LT名.工種2C
    AND T単価.工種3C=LT名.工種3C;
必ず117820件となります


>クエリの中でクエリを呼び出している箇所があるので
>そちらを纏めてみたら結果はどうなりますでしょうか。
ん〜
そんなことが出来るのですか

そのまま試してみましたが
FROM 句の構文エラーです。

>>アクセス一応使えるつもりです
なんて書いてしまいましたが、SQLもたまに見るぐらいで低レベルです

SQLビューで仕様を1づつ追加して試してみました
(ご提示頂いたSQLと同じですが・・・・)


仕様を1つ左外部結合してみました
SELECT T単価.*
FROM (((T単価
  LEFT JOIN LT部位
    ON T単価.部C = LT部位.部C)
  LEFT JOIN LT単位
    ON T単価.単位C = LT単位.単位C)
  LEFT JOIN LT名
    ON T単価.区C = LT名.区C
    AND T単価.工種1C=LT名.工種1C
    AND T単価.工種2C=LT名.工種2C
    AND T単価.工種3C=LT名.工種3C)
  LEFT JOIN LT仕様
    ON T単価.工種1C=LT仕様.工種C
    AND T単価.仕様C1+1000=LT仕様.仕区C*1000+LT仕様.仕様C;
動作できましたが
レコード件数は、
117819件
117820件
とかになります

仕様を2つ左外部結合してみました
SELECT T単価.*
FROM ((((T単価
  LEFT JOIN LT部位
    ON T単価.部C = LT部位.部C)
  LEFT JOIN LT単位
    ON T単価.単位C = LT単位.単位C)
  LEFT JOIN LT名
    ON T単価.区C = LT名.区C
    AND T単価.工種1C=LT名.工種1C
    AND T単価.工種2C=LT名.工種2C
    AND T単価.工種3C=LT名.工種3C)
  LEFT JOIN LT仕様 AS T1
    ON T単価.仕様C1+1000=T1.仕区C*1000+T1.仕様C
    AND T単価.工種1C=T1.工種C)
  LEFT JOIN LT仕様 AS T2
    ON T単価.仕様C2+2000=T2.仕区C*1000+T2.仕様C
    AND T単価.工種1C=T2.工種C;
動作できました
レコード件数はやはり
117819件
117820件
とかになります

>そんなことが出来るのですか
ただ、デザインビューにすると
デザイン ビューで、連結式 T単価.仕様C1+1000=T1.仕区C*1000+T1.仕様C を表示できません。
と怒られてしまいましたが
クエリを使ったクエリよりもこちらのすっきりしてよさげな気がします
1歩前進できました ご教授ありがとうございました


117819件
117820件
ですが
よくわかりませんが、CPUのせいではないような気はしますが・・・・
ちなみに
Intel(R) Core(TM)2 Duo CPU 
E4400 @ 2.00GHz
1.99 GHz、0.99 GB RAM
で、クエリ表示後最終レコードに移行すると7秒ぐらいかかります


ふと、クエリ結果件数が毎度異なるなんて 
バグぽっい動きみたいな気もしなくは無いですが、どうなんでしょう・・・・
場合によっては
敷居が高いけど今回は SQL Server Express Edition + ADP にしようかな・・・


とりとめのない書き込みになってしまいましたが
アドバイスありましたらよろしくお願いいたします

【11353】Re:クエリ結果件数が違う
発言  pon  - 10/1/6(水) 17:37 -

引用なし
パスワード
   追記です

>12万を超える件数でも pon さんの様な事象にあった事がありません。
バグではないですね
失礼しました

【11354】Re:クエリ結果件数が違う
回答  小僧  - 10/1/6(水) 17:53 -

引用なし
パスワード
   ▼pon さん:
こんにちは。

>レコード件数は、
> 117819件
> 117820件
> とかになります

うーん、残念です。


> よくわかりませんが、CPUのせいではないような気はしますが・・・・

当方もはっきりとした論拠がある訳ではありませんが、
メモリ256MB のPC で不安定だったクエリが
メモリを1Gに増設した所、安定した経験があります。


> 敷居が高いけど今回は 
> SQL Server Express Edition + ADP にしようかな・・・

元データがSQLServerにあるのでしたら
クエリ部分をViewとしてSQLServer側に保存し、
AccessからはViewを見に行く方法もありますね。

Q01仕様 はSQLServer側でViewとして保存
Q02JOBリ は自MDB側でワークテーブルとして保存
両者を結合させるのであれば
単純なテーブル同士の等価結合になる為、
Accessの負担が軽くなるかと思われます。


以下、MDBのバックアップを取ってから試してみて下さい。

Sub ワークテーブルを使用()
Dim DB As DAO.Database
Dim strSQL As String
Dim QD As DAO.QueryDef


  Set DB = CurrentDb
  
On Error Resume Next
  strSQL = "Drop Table WT01仕様"
  DB.Execute strSQL
  
  strSQL = "Drop Table WT02JOBリ"
  DB.Execute strSQL

  DB.CreateQueryDef "Q03JOB仕リ", "SELECT 1"

On Error GoTo 0

  strSQL = " SELECT LT仕様.*, [仕区C]*1000+[仕様C] AS tmp " _
      & " INTO WT01仕様 " _
      & " FROM LT仕様;"
  DB.Execute strSQL, dbFailOnError

  strSQL = " SELECT T単価.*, " _
      & " 1000+[仕様C1] AS S1, " _
      & " 2000+[仕様C2] AS S2, " _
      & " 3000+[仕様C3] AS S3, " _
      & " 4000+[仕様C4] AS S4, " _
      & " 5000+[仕様C5] AS S5, " _
      & " 6000+[仕様C6] AS S6, " _
      & " 7000+[仕様C7] AS S7 " _
      & " INTO WT02JOBリ " _
      & " FROM T単価;"
  DB.Execute strSQL, dbFailOnError

  strSQL = ""
  strSQL = strSQL & " SELECT WT02JOBリ.*, WT01仕様.名称, "
  strSQL = strSQL & "    WT01仕様_1.名称, WT01仕様_2.名称, "
  strSQL = strSQL & "    WT01仕様_3.名称, WT01仕様_4.名称, "
  strSQL = strSQL & "    WT01仕様_5.名称, WT01仕様_6.名称 "
  strSQL = strSQL & " FROM (((((((((WT02JOBリ "
  strSQL = strSQL & " LEFT JOIN LT部位 ON WT02JOBリ.部C = LT部位.部C) "
  strSQL = strSQL & " LEFT JOIN LT名 ON (WT02JOBリ.区C = LT名.区C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種3C = LT名.工種3C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種2C = LT名.工種2C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種1C = LT名.工種1C)) "
  strSQL = strSQL & " LEFT JOIN LT単位 "
  strSQL = strSQL & "      ON WT02JOBリ.単位C = LT単位.単位C) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 "
  strSQL = strSQL & "      ON (WT02JOBリ.S1 = WT01仕様.tmp) "
  strSQL = strSQL & "     AND (WT02JOBリ.工種1C = WT01仕様.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_1 "
  strSQL = strSQL & "   ON (WT02JOBリ.S2 = WT01仕様_1.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_2 "
  strSQL = strSQL & "   ON (WT02JOBリ.S3 = WT01仕様_2.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_3 "
  strSQL = strSQL & "  ON (WT02JOBリ.S4 = WT01仕様_3.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_4 "
  strSQL = strSQL & "   ON (WT02JOBリ.S5 = WT01仕様_4.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_5 "
  strSQL = strSQL & "   ON (WT02JOBリ.S6 = WT01仕様_5.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_6 "
  strSQL = strSQL & "   ON (WT02JOBリ.S7 = WT01仕様_6.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);"


  Set QD = DB.QueryDefs("Q03JOB仕リ")
    QD.SQL = strSQL
    QD.Close
  Set QD = Nothing

  DoCmd.OpenQuery "Q03JOB仕リ"

End Sub

クエリ部分をワークテーブルに保存する様にし、
Q03JOB仕リ を書き換えております。
これで件数が安定する様でしたら
計算させながらの結合の所に問題がありそうですね。

(SELECT 〜 INTO 句でテーブルを作っている為に
 Index が外れておりますので
 結果表示が遅い場合にはワークテーブルに Index を設定して下さい)


> ふと、クエリ結果件数が毎度異なるなんて 
> バグぽっい動きみたいな気もしなくは無いですが、どうなんでしょう・・・・

Accessの弱点として、データベースエンジンである
Jet Database Engine の安定性が良くない事があげられます。

テーブル同士を素直に繋ぐSQLであれば
それほど問題が起きる事はないのですが
不等価結合 (T_1.Field1 <> T_2.Field1) や
複雑なサブクエリを用いると
固まってしまったり、Accessそのものが落ちてしまったりと
不安定な動きをする事が多々あります。

今回は

>デザイン ビューで、連結式
> T単価.仕様C1+1000=T1.仕区C*1000+T1.仕様C を表示できません。

の様に、フィールドを計算させながら結合している箇所が
問題になってそうですね。

もちろん、より安定したツールを手に入れる為に
お金や時間を掛けるのは正しい方法だと思いますが
Accessへの負担を減らし安定させるのも
1つの手だと考えております。

【11378】Re:クエリ結果件数が違う
質問  pon  - 10/1/13(水) 17:40 -

引用なし
パスワード
   ▼小僧 さん:
ありがとうございます
大変遅くなりました

>当方もはっきりとした論拠がある訳ではありませんが、
>メモリ256MB のPC で不安定だったクエリが
>メモリを1Gに増設した所、安定した経験があります。

そうなんですか
未経験だったので勉強になります
ありがとうございました


>クエリ部分をワークテーブルに保存する様にし、
>Q03JOB仕リ を書き換えております。
>これで件数が安定する様でしたら
>計算させながらの結合の所に問題がありそうですね。
では
安定して動作することが出来ました
速度もそこそこ速いです・・・・が・・・・


ただ、下記よくわかりません
わかりにくいと思いますがよろしくお願い致します

頂いたコード実行すると
QD.SQL = strSQL   '←でstop
実行時エラー '3131':
FROM 句の構文エラーです。
となってしまいました

そこでクエリに直接SQLを貼ってみましたが同じでした

---------------------------------------------
不具合SQLは(ご提示コードで作成されるクエリ)
SELECT WT02JOBリ.*
, WT01仕様.名称
WT01仕様_1.名称
, WT01仕様_2.名称
,WT01仕様_3.名称
, WT01仕様_4.名称
,WT01仕様_5.名称
, WT01仕様_6.名称 
FROM (((((((((WT02JOBリ 
LEFT JOIN LT部位
ON WT02JOBリ.部C = LT部位.部C) 
LEFT JOIN LT名
ON (WT02JOBリ.区C = LT名.区C)       
AND (WT02JOBリ.工種3C = LT名.工種3C)       
AND (WT02JOBリ.工種2C = LT名.工種2C)       
AND (WT02JOBリ.工種1C = LT名.工種1C)) 
LEFT JOIN LT単位      
ON WT02JOBリ.単位C = LT単位.単位C) 
LEFT JOIN WT01仕様      
ON (WT02JOBリ.S1 = WT01仕様.tmp)      
AND (WT02JOBリ.工種1C = WT01仕様.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_1   
ON (WT02JOBリ.S2 = WT01仕様_1.tmp)   
AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_2   
ON (WT02JOBリ.S3 = WT01仕様_2.tmp)   
AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_3   
ON (WT02JOBリ.S4 = WT01仕様_3.tmp)  
AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_4   
ON (WT02JOBリ.S5 = WT01仕様_4.tmp)   
AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_5   
ON (WT02JOBリ.S6 = WT01仕様_5.tmp)   
AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) 
LEFT JOIN WT01仕様 AS WT01仕様_6   
ON (WT02JOBリ.S7 = WT01仕様_6.tmp)   
AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);

---------------------------------------------
動いたSQLは
SELECT WT02JOBリ.*
, WT01仕様.名称
,WT01仕様_1.名称
, WT01仕様_2.名称
,WT01仕様_3.名称
, WT01仕様_4.名称
,WT01仕様_5.名称
, WT01仕様_6.名称
FROM (((((((((WT02JOBリ
LEFT JOIN LT部位
ON WT02JOBリ.部C = LT部位.部C)
LEFT JOIN LT名
ON (WT02JOBリ.区C = LT名.区C)
AND (WT02JOBリ.工種3C = LT名.工種3C)
AND (WT02JOBリ.工種2C = LT名.工種2C)
AND (WT02JOBリ.工種1C = LT名.工種1C))
LEFT JOIN LT単位
ON WT02JOBリ.単位C = LT単位.単位C)
LEFT JOIN WT01仕様
ON (WT02JOBリ.S1 = WT01仕様.tmp)
AND (WT02JOBリ.工種1C = WT01仕様.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_1
ON (WT02JOBリ.S2 = WT01仕様_1.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_1.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_2
ON (WT02JOBリ.S3 = WT01仕様_2.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_2.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_3
ON (WT02JOBリ.S4 = WT01仕様_3.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_3.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_4
ON (WT02JOBリ.S5 = WT01仕様_4.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_4.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_5
ON (WT02JOBリ.S6 = WT01仕様_5.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_5.工種C))
LEFT JOIN WT01仕様 AS WT01仕様_6
ON (WT02JOBリ.S7 = WT01仕様_6.tmp)
AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);

違う場所は
18行目の
LEFT JOIN LT単位
の場所だけです


頂いたコードでは不具合から抜け出せず
下記のようにして
動くSQLを20:以下で直張りしたら動作確認できました

  DB.Execute strSQL, dbFailOnError
  
  GoTo 20:

  strSQL = ""
  strSQL = strSQL & " SELECT WT02JOBリ.*, WT01仕様.名称, "
  strSQL = strSQL & "    WT01仕様_1.名称, WT01仕様_2.名称, "
  strSQL = strSQL & "    WT01仕様_3.名称, WT01仕様_4.名称, "
  strSQL = strSQL & "    WT01仕様_5.名称, WT01仕様_6.名称 "
  strSQL = strSQL & " FROM (((((((((WT02JOBリ "
  strSQL = strSQL & " LEFT JOIN LT部位 ON WT02JOBリ.部C = LT部位.部C) "
  strSQL = strSQL & " LEFT JOIN LT名 ON (WT02JOBリ.区C = LT名.区C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種3C = LT名.工種3C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種2C = LT名.工種2C) "
  strSQL = strSQL & "       AND (WT02JOBリ.工種1C = LT名.工種1C)) "
  
  
  'strSQL = strSQL & " LEFT JOIN LT単位 "
  'strSQL = strSQL & " LEFT JOIN LT単位"
  'strSQL = strSQL & "LEFT JOIN LT単位"
  strSQL = strSQL & " LEFT JOIN LT単位 "
  
  
  strSQL = strSQL & " LEFT JOIN WT01仕様 "
  strSQL = strSQL & "      ON (WT02JOBリ.S1 = WT01仕様.tmp) "
  strSQL = strSQL & "     AND (WT02JOBリ.工種1C = WT01仕様.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_1 "
  strSQL = strSQL & "   ON (WT02JOBリ.S2 = WT01仕様_1.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_2 "
  strSQL = strSQL & "   ON (WT02JOBリ.S3 = WT01仕様_2.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_3 "
  strSQL = strSQL & "  ON (WT02JOBリ.S4 = WT01仕様_3.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_4 "
  strSQL = strSQL & "   ON (WT02JOBリ.S5 = WT01仕様_4.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_5 "
  strSQL = strSQL & "   ON (WT02JOBリ.S6 = WT01仕様_5.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_6 "
  strSQL = strSQL & "   ON (WT02JOBリ.S7 = WT01仕様_6.tmp) "
  strSQL = strSQL & "  AND (WT02JOBリ.工種1C = WT01仕様_6.工種C);"
  
  
20:

  strSQL = ""
  strSQL = strSQL & " SELECT WT02JOBリ.* "
  strSQL = strSQL & " , WT01仕様.名称 "
  strSQL = strSQL & " ,WT01仕様_1.名称 "
  strSQL = strSQL & " , WT01仕様_2.名称 "
  strSQL = strSQL & " ,WT01仕様_3.名称 "
  strSQL = strSQL & " , WT01仕様_4.名称 "
  strSQL = strSQL & " ,WT01仕様_5.名称 "
  strSQL = strSQL & " , WT01仕様_6.名称 "
  strSQL = strSQL & " FROM (((((((((WT02JOBリ "
  strSQL = strSQL & " LEFT JOIN LT部位 "
  strSQL = strSQL & " ON WT02JOBリ.部C = LT部位.部C) "
  strSQL = strSQL & " LEFT JOIN LT名 "
  strSQL = strSQL & " ON (WT02JOBリ.区C = LT名.区C) "
  strSQL = strSQL & " AND (WT02JOBリ.工種3C = LT名.工種3C) "
  strSQL = strSQL & " AND (WT02JOBリ.工種2C = LT名.工種2C) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = LT名.工種1C)) "
  strSQL = strSQL & " LEFT JOIN LT単位 "
  strSQL = strSQL & " ON WT02JOBリ.単位C = LT単位.単位C) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 "
  strSQL = strSQL & " ON (WT02JOBリ.S1 = WT01仕様.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_1 "
  strSQL = strSQL & " ON (WT02JOBリ.S2 = WT01仕様_1.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_1.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_2 "
  strSQL = strSQL & " ON (WT02JOBリ.S3 = WT01仕様_2.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_2.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_3 "
  strSQL = strSQL & " ON (WT02JOBリ.S4 = WT01仕様_3.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_3.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_4 "
  strSQL = strSQL & " ON (WT02JOBリ.S5 = WT01仕様_4.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_4.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_5 "
  strSQL = strSQL & " ON (WT02JOBリ.S6 = WT01仕様_5.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_5.工種C)) "
  strSQL = strSQL & " LEFT JOIN WT01仕様 AS WT01仕様_6 "
  strSQL = strSQL & " ON (WT02JOBリ.S7 = WT01仕様_6.tmp) "
  strSQL = strSQL & " AND (WT02JOBリ.工種1C = WT01仕様_6.工種C); "


  Set QD = DB.QueryDefs("Q03JOB仕リ")
    QD.SQL = strSQL
    QD.Close
  Set QD = Nothing

  DoCmd.OpenQuery "Q03JOB仕リ"


うまく再現できているか不明ですが
空白等に問題があるのでしょうか?
(文字面的には差異は無いのですが・・・・)
また、頂いたコードには不具合は無いと思いますが
このようなエラーが出てしまう原因が掴めませんでした

アドバイス有りましたらよろしくお願い致します


動作だけは確認できました
ワークテーブル?ってあいまいなイメージしかありませんでしたが
作業用に用意するテーブルのことだったんですね。

>Q01仕様 はSQLServer側でViewとして保存
>Q02JOBリ は自MDB側でワークテーブルとして保存
>両者を結合させるのであれば
>単純なテーブル同士の等価結合になる為、
>Accessの負担が軽くなるかと思われます。
アドバイスありがとうございます
こちらについては、理解できました


上記Qわかりにくいと思いますが
何か有りましたらよろしくお願い致します

【11380】Re:クエリ結果件数が違う
回答  小僧  - 10/1/13(水) 18:02 -

引用なし
パスワード
   ▼pon さん:
こんにちは。

>安定して動作することが出来ました
>速度もそこそこ速いです・・・・が・・・・

とりあえずは安定した動作になって何よりです。

> 実行時エラー '3131':
> FROM 句の構文エラーです。
> となってしまいました

何度かコピー&ペーストされてお気づきかと思われますが
こちらの掲示板では投稿時に半角スペースが2個並ぶと
全角スペース1個に変換されてしまう様です。

>   'strSQL = strSQL & " LEFT JOIN LT単位 "
>   'strSQL = strSQL & " LEFT JOIN LT単位"
>   'strSQL = strSQL & "LEFT JOIN LT単位"
>   strSQL = strSQL & " LEFT JOIN LT単位 "

色々試して頂いた様ですが(笑)
半角スペースが1個であれば動作するかと思われます。

(半角のスペースであれば2個以上続いてもSQL上は問題ありませんが
 全角のスペースはエラーになります)

当方の癖づけとして文字列の連結をする際、
前後どちらかのスペース挿入を忘れても動作するように
両方に半角スペースを入れております。
(せこいですよね…)

【11407】Re:クエリ結果件数が違う
お礼  pon  - 10/1/21(木) 17:30 -

引用なし
パスワード
   ▼小僧 さん:
大変遅くなりました m(_ _)m

>とりあえずは安定した動作になって何よりです。
ありがとうございました

>何度かコピー&ペーストされてお気づきかと思われますが
>こちらの掲示板では投稿時に半角スペースが2個並ぶと
>全角スペース1個に変換されてしまう様です。
なんか変・・・・
とは思っていたのですが、
こういう掲示板の仕様もあるんですね
勉強になりました

>両方に半角スペースを入れております。
>(せこいですよね…)
テクニックのご紹介ありがとうございます
利用させて頂きたいと思います


ADPなんか理解が進みません・・・ (T_T)
今後もご指導よろしくお願いいたします  m(_ _)m

505 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free