2012-02-15 4 views
4

내 테이블 F0005를 올바르게 필터링하는 데 문제가 있습니다. 나는이 쿼리를 여러 가지 방법으로 시도했다. 내가 성취하고자하는 것은 내가 가입하기 전에 F0005를 걸러내는 것입니다.LEFT JOIN 중첩 선택문

이것은 필터링 된 결과이며 그 결과는 해당 테이블에서만 완벽합니다.

SELECT LTRIM(F0005.DRKY), F0005.DRDL01, F0005.DRRT, F0005.DRSY 
    FROM 
      SENCOM.F0005 F0005 
      WHERE LTRIM(F0005.DRKY) != '' AND F0005.DRRT IN ('W1','08') AND F0005.DRSY NOT IN ('30','32','98') 

여기 내 모든 쿼리와 합류하기 전에 테이블을 필터링하려는 시도가 있습니다. 나는이 때

SELECT 
    FSALES2011.SXAN8, 
    FSALES2011.SXCO AS Company, 
    FSALES2011.SXMCU AS BuisinessUnit, 
    FSALES2011.SXLITM AS ItemNumber, 
    FSALES2011.SXSLSM AS SalesPersonCode, 
    FSALES2011.SXDCTO AS OrderType, 
    FSALES2011.SXSLD1 AS SoldTo, 
    FSALES2011.SXADD1 AS Address, 
    FSALES2011.SXRP01 AS Division, 
    FSALES2011.SXRP02 AS Location, 
    FSALES2011.SXCI13+FSALES2011.SXCI14+FSALES2011.SXCI15+FSALES2011.SXCI16+FSALES2011.SXCI17+ 
    FSALES2011.SXCI18+FSALES2011.SXCI19+FSALES2011.SXCI20+FSALES2011.SXCI21+FSALES2011.SXCI22+ 
    FSALES2011.SXCI23+FSALES2011.SXCI24 AS PurchasePrice, 
    FSALES2011.SXAS13+FSALES2011.SXAS14+FSALES2011.SXAS15+FSALES2011.SXAS16+FSALES2011.SXAS17+ 
    FSALES2011.SXAS18+FSALES2011.SXAS19+FSALES2011.SXAS20+FSALES2011.SXAS21+FSALES2011.SXAS22+ 
    FSALES2011.SXAS23+FSALES2011.SXAS24 AS SalesPrice, 
    F4801.WAAN8, 
    F4801.WAWR01   AS WoType, 
    DIGITS(F4801.WADOCO) AS F4801ItemNumber, 
    F0101.ABAN8, 
    F0101.ABAC15    AS F0101CustomerType, 
    F0006.MCRP08    AS JobType, 
    SUBSTR(F0006.MCMCU,6,7) AS F0006BuisnessUnit, 
    LTRIM(F0005Filtered.DRKY) AS UDC, 
    F0005Filtered.DRDL01  AS Description, 
    F0005Filtered.DRRT, 
    F0005Filtered.DRSY 
    FROM 
    SENDTA.F0101 F0101 
    JOIN 
    JDEMOD.FSALES2011 FSALES2011 
    ON 
    FSALES2011.SXAN8 = F0101.ABAN8 
    LEFT OUTER JOIN 
    SENDTA.F0006 F0006 
    ON 
    FSALES2011.SXLITM = SUBSTR(F0006.MCMCU,6,7) 
    LEFT OUTER JOIN 
    SENDTA.F4801 F4801 
    ON 
    FSALES2011.SXLITM = DIGITS(F4801.WADOCO) 
    LEFT OUTER JOIN 
    (
     SELECT 
      LTRIM(F0005.DRKY), 
      F0005.DRDL01, 
      F0005.DRRT, 
      F0005.DRSY 
      FROM 
      SENCOM.F0005 F0005 
     WHERE 
      LTRIM(F0005.DRKY) != '' 
     AND F0005.DRRT IN ('W1', 
          '08') 
     AND F0005.DRSY NOT IN ('30', 
           '32', 
           '98')) F0005Filtered 
    ON 
    ABAC15 = F0005Filtered.DRKY 

나는 열 오류, SQL0205] 열 DRKY 테이블에 *의 N에 F0005FILTERED하지 얻을.

어떤 도움을 주셔서 감사합니다. 나는 이것에 익숙하지 않고 아이디어가 부족합니다 !! :)

큰 문제 덕분에 내 문제는 내 중첩 된 선택 항목의 형식이지만 완전히 다른 것입니다. 나는 잘못된 필드에 합류 했으므로 아무런 일치도 없었고 왜 NULLs를 얻었는지! 다시 한 번 감사드립니다 !!

여기가 최종 버전입니다. 이드는 몇몇 최적화 제안에 개방적이다. 그렇지 않으면 다행입니다!

SELECT 
    FSALES2011.SXAN8, 
    FSALES2011.SXCO AS Company, 
    FSALES2011.SXMCU AS BuisinessUnit, 
    FSALES2011.SXLITM AS ItemNumber, 
    FSALES2011.SXSLSM AS SalesPersonCode, 
    FSALES2011.SXDCTO AS OrderType, 
    FSALES2011.SXSLD1 AS SoldTo, 
    FSALES2011.SXADD1 AS Address, 
    FSALES2011.SXRP01 AS Division, 
    FSALES2011.SXRP02 AS Location, 
    FSALES2011.SXCI13+FSALES2011.SXCI14+FSALES2011.SXCI15+FSALES2011.SXCI16+FSALES2011.SXCI17+ 
    FSALES2011.SXCI18+FSALES2011.SXCI19+FSALES2011.SXCI20+FSALES2011.SXCI21+FSALES2011.SXCI22+ 
    FSALES2011.SXCI23+FSALES2011.SXCI24 AS PurchasePrice, 
    FSALES2011.SXAS13+FSALES2011.SXAS14+FSALES2011.SXAS15+FSALES2011.SXAS16+FSALES2011.SXAS17+ 
    FSALES2011.SXAS18+FSALES2011.SXAS19+FSALES2011.SXAS20+FSALES2011.SXAS21+FSALES2011.SXAS22+ 
    FSALES2011.SXAS23+FSALES2011.SXAS24 AS SalesPrice, 
    F4801.WAAN8, 
    F4801.WAWR01   AS WoType, 
    DIGITS(F4801.WADOCO) AS F4801ItemNumber, 
    F0101.ABAN8, 
    F0101.ABAC15   AS F0101CustomerType, 
    F0006.MCRP08   AS JobType, 
    SUBSTR(F0006.MCMCU,6,7) AS F0006BuisnessUnit, 
    LTRIM(UDC.DRKY)   AS Code, 
    --UDC.DRDL01    AS JobDescription, 
    --UDC2.DRDL01    AS WODescription, 
    COALESCE(UDC.DRDL01,UDC2.DRDL01) AS WorkPerformed, 
    UDC3.DRDL01      AS CustomerDescription 
FROM 
    SENDTA.F0101 F0101 
JOIN 
    JDEMOD.FSALES2011 FSALES2011 
ON 
    FSALES2011.SXAN8 = F0101.ABAN8 
LEFT OUTER JOIN 
    SENDTA.F0006 F0006 
ON 
    FSALES2011.SXLITM = SUBSTR(F0006.MCMCU,6,7) 
LEFT OUTER JOIN 
    SENDTA.F4801 F4801 
ON 
    FSALES2011.SXLITM = DIGITS(F4801.WADOCO) 
LEFT OUTER JOIN 
    SENCOM.F0005 UDC 
ON 
    F0006.MCRP08 = LTRIM(UDC.DRKY) 
AND LTRIM(UDC.DRKY) != '' 
AND UDC.DRRT IN ('W1', 
       '08') 
AND UDC.DRSY NOT IN ('30', 
        '32', 
        '98') 
LEFT OUTER JOIN 
    SENCOM.F0005 UDC2 
ON 
    F4801.WAWR01 = LTRIM(UDC2.DRKY) 
AND LTRIM(UDC2.DRKY) != '' 
AND UDC2.DRRT IN ('W1', 
        '08') 
AND UDC2.DRSY NOT IN ('30', 
         '32', 
         '98') 
LEFT OUTER JOIN 
    SENCOM.F0005 UDC3 
ON 
    F0101.ABAC15 = LTRIM(UDC3.DRKY) 
AND LTRIM(UDC3.DRKY) != '' 
AND UDC3.DRRT IN ('15') 
+0

고마워요! AS를 추가하면 실행이 가능해 지지만 이제는 원하는대로하지 않는 것이 내 문제입니다! F0005는 다른 테이블 중 하나의 코드에 대한 설명을 가지고 있습니다. 이 조인을 수행 할 때 모든 설명이 NULL입니다. – jcervantes

+0

쿼리를 한 번에 한 조각 씩 진행하십시오. 작은 쿼리로 시작한 다음 조인을 추가하면 비 전형적인 동작이 어느 시점에서 발생하는지 확인할 수 있습니다. 그 조인은 당신이 조사 할 필요가있는 것입니다. 필드의 값이 예상하는 값입니까? 예를 들어 ABAC15를 LTRIM (DRKY)에 가입시킬 때 실제로 일치하는 항목이 있는지 확인 했습니까? LTRIM (ABAC15)도 필요합니까? – MatBailie

+0

@jcervantes 설명이 NULL이라고 말하면 확실합니까? 귀하가 합류하는 기록에 대한 설명입니까? – Taryn

답변

9

함수에서 필드를 래핑하는 경우 나중에 이름을 지정해야합니다.

변경 LTRIM(F0005.DRKY), 당신의 중첩 된 쿼리에서 LTRIM(F0005.DRKY) AS DRKY,

+0

빠른 답장을 보내 주셔서 감사합니다. 모든 null 값을 가져 오는 이유는 무엇입니까? 무엇이 좋은 방법입니까? – jcervantes

6

에 당신은 DRKY에 대한 별칭을 누락 :

SELECT 
      LTRIM(F0005.DRKY) as DRKY, 
      F0005.DRDL01, 
      F0005.DRRT, 
      F0005.DRSY 
      FROM SENCOM.F0005 F0005 
     WHERE LTRIM(F0005.DRKY) != '' 
     AND F0005.DRRT IN ('W1', 
          '08') 
     AND F0005.DRSY NOT IN ('30', 
           '32', 
           '98')) F0005Filtered 

LTRIM(F0005.DRKY)

에 대한 더 열 이름을 반환하지 때 별명이없는 경우
6

필터링 된 테이블에서 계산 된 열의 이름을 지정해야합니다.

SELECT LTRIM(F0005.DRKY) AS DRKY, F0005.DRDL01, F0005.DRRT, F0005.DRSY 
FROM SENCOM.F0005 F0005 
WHERE LTRIM(F0005.DRKY) != '' 
    AND F0005.DRRT IN ('W1','08') 
    AND F0005.DRSY NOT IN ('30','32','98') 

참고 AS DRKY

3

당신은 정말 당신의 질문을 포맷해야하지만, 난 당신이 잘못 갈 어디 알고 믿습니다.

테이블 별명 F0005Filtered는 JDE 사용자 정의 코드 테이블의 별명이 아닙니다. F0005Filtered가 실제로 나타내는 항목 인 하위 선택을 만들었습니다.

또한 하위 선택 영역에는 DRKY라는 열이 없습니다.

해당 필드에서 TRIM 기능을 사용 중이며 열 이름을 지정하지 않습니다.

단순히 별칭을 재 작성, 수정하려면 : - 사용자의 질문에 대한 응답으로

LTRIM(F0005.DRKY) AS DRKY 

편집

.

왜 IN 문을 JOIN 조건의 일부로 만들지 않습니까?

LEFT OUTER JOIN 
    SENCOM.F0005 UDC 
ON LTRIM(UDC.DRKY) != '' 
AND ABAC15 = TRIM(UDC.DRKY) 
AND UDC.DRRT IN ('W1','08') 
AND UDC.DRSY NOT IN ('30', '32','98') 

사용자 정의 코드 테이블은 그다지 큰 경향이 없습니다. 나는 다국적 기업을 위해 일을하고 우리는 약 70,000 행을 가지고 있습니다.

+0

데이터에 익숙한 것 같습니다. – jcervantes

+0

예, 저는 JDE에 익숙하지만 Enterprise에서 엔터프라이즈까지 다양합니다. 개인적으로 나는 심각한 필요가있을 때 전체 테이블을 아래로 당깁니다. 매우 유용합니다.) UDC 테이블을 subselect로 사용해야하는 이유가 무엇인지 알지 못합니다. –

+0

아이러니 컬하게 설명합니다. e 판매 데이터가있는 사용자 정의 테이블 인 FSALES. 저는 F0101과 F4801에 Job Type Code와 Customer Type Code가 있기 때문에 함께합니다. F0005에는 코드에 대한 설명이 있습니다. 그래서 사람들이 그들을 찾아 보지 않아도되기를 바랍니다. 내 문제는 F0005가 내가 필요로하는 정보에 대한 UDC 데이터 이상을 가지고있는 것 같다. 따라서 왼쪽 조인을하면 많은 추가 데이터가 생깁니다. ON F0101.ABAC15 = F0005.DRKY DRKY에 많은 중복이 있기 때문에 내 행이 70000에서 약 300000으로 이동합니다. – jcervantes