2017-12-22 11 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]; 

구문과 동일하다. 참조 테이블 이름과 필드 이름 만 다릅니다. 그렇다면 왜 한 표현식에 표현식을 결합 할 수 있습니까? 나는이 문제를 탐색하고 JOIN 문에 ON 뒤에 모든 것을 대괄호로 묶으라고 제안했습니다. 나는 그것을 시도했지만 문제가 해결되지 않았다.

나는이 것에 절대적으로 붙어 있기 때문에 어떤 제안이라도 인정 될 것입니다.

+0

구문이 테이블과 필드와 완전히 같지 않습니다. 후자에는 '내부 결합'이 있습니다. 액세스 쿼리는 여러 JOIN을 사용하여 자체적으로 스크립트를 작성하기가 매우 어렵습니다. SQL 디자인에서 '/'로'ON' 절의 오류를 믿을 수있는 쿼리 디자인을 가능한 한 많이 빌드 한 다음 SQL 뷰로 확장하십시오. – Parfait

+0

내 제안은 중첩 된 조인을 제거하고 리팩터링하여 줄을 정렬하는 것입니다. 훨씬 읽기 쉽습니다. 나는 왜 Access가 이런 방식으로하는 것을 좋아하는지 모르지만, 이렇게 될 필요는 없습니다. 나는 그 방식으로 리팩토링 된 답변을 쓸 것입니다. – Alan

+0

SQL보기에서 데이터 시트보기로 전환하면 Access에서 오류를 표시 한 다음 SQL의 일부를 강조 표시해야합니다. 어떤 부분입니까? – Andre

답변

0

JOIN 명령문의 끝에있는 결합으로 사용하려고했던 내부 조인과 잘 작동하지 않습니다. LEFT JOIN으로 시도해보십시오. 그것은 당신에게 당신이 원하는 결과를 제공하지 않는 경우, 당신은 또한 제공하는 SELECT 문을 중첩 시도 할 수

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]; 

: 그런 다음 WHERE 문에서 제외 NULL을하여 오른쪽에 일치 없었다 것들을 제거 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