2017-12-22 26 views
0

これにより、私は一日中頭を悩ませました。計算されたフィールドを使用して結合しようとしているところで、複数のクエリがあります。この最初のクエリは意図したとおりに動作しますが、MS Accessデザインビューは機能しません。これはSQLビューで編集できるので大したことではありません。作業クエリの微妙な変更により、JOINエラーが発生する

SELECT PM_qryBOM_1.parentid AS LVL0, 
     PM_qryBOM_1.childid AS LVL1, 
     [PM_qryBOM_1].[parent_part_no] & "/" & [PM_qryBOM_1].[child_part_no] AS BOM_Address, 
     PM_qryBOM_1.qty, 
     [PM_qryBOM_1].[parentid] & "/" & [PM_qryBOM_1].[childid] AS BOM_ID, 
     sol_avgcost.avgcost_material, 
     sol_avgcost.avgcost_labor, 
     sol_avgcost.avgcost_sub, 
     cm_qrypndj_avg.avgofunit_hrs, 
     PM_qryBOM_1.parentid AS Parent_BOM_ID, 
     PM_qryBOM_1.parent_part_no AS Parent_BOM_Address, 
     pm_qrybom_lvl1_costroll.mult 
FROM (((pm_qrybom AS PM_qryBOM_1 
      LEFT JOIN pm_qrybom AS PM_qryBOM_t 
       ON PM_qryBOM_1.parentid = PM_qryBOM_t.childid) 
     LEFT JOIN sol_avgcost 
       ON PM_qryBOM_1.child_part_no = sol_avgcost.part_no) 
     LEFT JOIN cm_qrypndj_avg 
       ON PM_qryBOM_1.child_part_no = cm_qrypndj_avg.part_no) 
     LEFT JOIN pm_qrybom_lvl1_costroll 
       ON [PM_qryBOM_1].[parentid] & "/" & [PM_qryBOM_1].[childid] = 
       pm_qrybom_lvl1_costroll.parent_bom_id 
WHERE (((PM_qryBOM_t.childid) IS NULL)) 
ORDER BY [PM_qryBOM_1].[parent_part_no] & "/" & [PM_qryBOM_1].[child_part_no]; 

私はJOINにこのようにしたいと思う複数の他の質問があります。そこで次のクエリに同じ構文を適用しようとしましたが、エラーが発生します。

JOIN式はサポートされていません。

SELECT pm_qrybom_lvl0.lvl0, 
     pm_qrybom.childid AS LVL1, 
     pm_qrybom.qty, 
     [pm_qrybom_lvl0].[bom_address] & "/" & [pm_qrybom].[child_part_no] AS BOM_Address, 
     [pm_qrybom_lvl0].[bom_id] & "/" & [pm_qrybom].[childid] AS BOM_ID, 
     pm_qrybom_lvl0.bom_address AS Parent_BOM_Address, 
     pm_qrybom_lvl0.bom_id AS Parent_BOM_ID, 
     sol_avgcost.avgcost_material, 
     cm_qrypndj_avg.avgofunit_hrs, 
     cm_collections.cpq_material, 
     pm_qrybom_lvl1_costroll.mult, 
     Iif([cm_collections].[cpq_material] <> 0, [cm_collections].[cpq_material], 
      Iif([mult] = 0, [sol_avgcost].[avgcost_material], [mult])) AS Material_Calc 
FROM ((((pm_qrybom_lvl0 
      INNER JOIN pm_qrybom 
        ON pm_qrybom_lvl0.lvl0 = pm_qrybom.parentid) 
      LEFT JOIN sol_avgcost 
       ON pm_qrybom.child_part_no = sol_avgcost.part_no) 
     LEFT JOIN cm_qrypndj_avg 
       ON pm_qrybom.child_part_no = cm_qrypndj_avg.part_no) 
     LEFT JOIN cm_collections 
       ON pm_qrybom.childid = cm_collections.partid) 
     LEFT JOIN pm_qrybom_lvl1_costroll 
       ON [pm_qrybom_lvl0].[bom_id] & "/" & [pm_qrybom].[childid] = 
       pm_qrybom_lvl1_costroll.parent_bom_id 
ORDER BY [pm_qrybom_lvl0].[bom_address] & "/" & [pm_qrybom].[child_part_no]; 

両方のクエリの構文は同じです。参照テーブル名とフィールド名のみが異なります。だから、私は1つのクエリで式に結合できますが、次のクエリでは結合できませんか?私はこの問題を探知し、JOINの文でONの後ろにすべてを囲むように括弧を入れることを提案しました。私はそれを試みたが、それは問題を解決しなかった。

私は絶対にこの1つに固執しているので、任意の提案をいただければ幸いです。

+0

異なるテーブルとフィールドで構文がまったく同じではありません。あなたは後者に 'INNER JOIN'を持っています。アクセスクエリは、複数の 'JOIN'を使用して独自にスクリプトを作成することは非常に困難です。私が '/'で 'ON'節で不具合を信じているクエリ設計でできるだけ構築してから、SQLビューで拡張してください。 – Parfait

+0

私の提案は、ネストされた結合を削除して、それらをリファクタリングして行にすることです。読みやすくなりました。私は、Accessがこのようにするのがなぜ好きであるか分かりませんが、このようにする必要はありません。私はそれをリファクタリングして答えを書きます。 – Alan

+0

SQLビューからデータシートビューに切り替えると、Accessにエラーが表示され、SQLの一部が強調表示されます。それはどの部分ですか? – Andre

答えて

0

これは、JOINステートメントの最後の連結で、使用しようとしたINNER JOINでうまくいきません。 LEFT JOINで試してみてください。次に、WHERE文でNULLを除外することで、右の一致がなかったものを削除します。

SELECT pm_qrybom_lvl0.lvl0, 
     pm_qrybom.childid AS LVL1, 
     pm_qrybom.qty, 
     [pm_qrybom_lvl0].[bom_address] & "/" & [pm_qrybom].[child_part_no] AS BOM_Address, 
     [pm_qrybom_lvl0].[bom_id] & "/" & [pm_qrybom].[childid] AS BOM_ID, 
     pm_qrybom_lvl0.bom_address AS Parent_BOM_Address, 
     pm_qrybom_lvl0.bom_id AS Parent_BOM_ID, 
     sol_avgcost.avgcost_material, 
     cm_qrypndj_avg.avgofunit_hrs, 
     cm_collections.cpq_material, 
     pm_qrybom_lvl1_costroll.mult, 
     Iif([cm_collections].[cpq_material] <> 0, [cm_collections].[cpq_material], 
      Iif([mult] = 0, [sol_avgcost].[avgcost_material], [mult])) AS Material_Calc 
FROM ((((pm_qrybom_lvl0 
      LEFT JOIN pm_qrybom 
        ON pm_qrybom_lvl0.lvl0 = pm_qrybom.parentid) 
      LEFT JOIN sol_avgcost 
       ON pm_qrybom.child_part_no = sol_avgcost.part_no) 
     LEFT JOIN cm_qrypndj_avg 
       ON pm_qrybom.child_part_no = cm_qrypndj_avg.part_no) 
     LEFT JOIN cm_collections 
       ON pm_qrybom.childid = cm_collections.partid) 
     LEFT JOIN pm_qrybom_lvl1_costroll 
       ON [pm_qrybom_lvl0].[bom_id] & "/" & [pm_qrybom].[childid] = 
       pm_qrybom_lvl1_costroll.parent_bom_id 
     WHERE pm_qrybom.parentid IS NOT NULL 
ORDER BY [pm_qrybom_lvl0].[bom_address] & "/" & [pm_qrybom].[child_part_no]; 

それはあなたが望む結果が得られない場合、あなたはまた、与えselect文を入れ子に試みることができますfromステートメントの連結を使用します。

のような何か:

SELECT iq.lvl0, 
     iq.childid AS LVL1, 
     iq.qty, 
     iq.BOM_Address, 
     iq.BOM_ID, 
     iq.Parent_BOM_Address, 
     iq.Parent_BOM_ID, 
     sol_avgcost.avgcost_material, 
     cm_qrypndj_avg.avgofunit_hrs, 
     cm_collections.cpq_material, 
     pm_qrybom_lvl1_costroll.mult, 
     Iif([cm_collections].[cpq_material] <> 0, [cm_collections].[cpq_material], 
      Iif([mult] = 0, [sol_avgcost].[avgcost_material], [mult])) AS Material_Calc 
FROM ((((SELECT pm_qrybom_lvl0.lvl0, pm_qrybom.childid, pm_qrybom.qty, 
     [pm_qrybom_lvl0].[bom_address] & "/" & [pm_qrybom].[child_part_no] AS BOM_Address, 
     [pm_qrybom_lvl0].[bom_id] & "/" & [pm_qrybom].[childid] AS bom_id, 
     pm_qrybom_lvl0.bom_address AS Parent_BOM_Address, 
     pm_qrybom_lvl0.bom_id AS Parent_BOM_ID 
     FROM pm_qrybom_lvl0 LEFT JOIN pm_qrybom 
        ON pm_qrybom_lvl0.lvl0 = pm_qrybom.parentid 
     WHERE pm_qrybom.parentid IS NOT NULL 

      ) AS iq 
      LEFT JOIN sol_avgcost 
       ON iq.child_part_no = sol_avgcost.part_no) 
     LEFT JOIN cm_qrypndj_avg 
       ON iq.child_part_no = cm_qrypndj_avg.part_no) 
     LEFT JOIN cm_collections 
       ON iq.childid = cm_collections.partid) 
     LEFT JOIN pm_qrybom_lvl1_costroll 
       ON iq.bom_id = 
       pm_qrybom_lvl1_costroll.parent_bom_id 

幸運。

+0

すべての提案をありがとう。私はこれらを試してみましょう! – jhalf2008

関連する問題