Access VBA質問箱 IV

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

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


1898 / 9994 ←次へ | 前へ→

【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わかりにくいと思いますが
何か有りましたらよろしくお願い致します
1,704 hits

【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 お礼[未読]

1898 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078197
(SS)C-BOARD v3.8 is Free