Вложенный оператор Select на LEFT JOIN - PullRequest
4 голосов
/ 15 февраля 2012

У меня проблема с правильной фильтрацией таблицы F0005.Я пробовал этот запрос разными способами.Чего я хочу добиться, так это отфильтровать F0005 перед тем, как присоединиться к нему.

Это то, как я хочу, чтобы он отфильтровывался, и результаты превосходны только для этой таблицы.

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

Когда я пытаюсь это сделать, я получаю ошибки Column, SQL0205] Столбец DRKY отсутствует в таблице F0005FILTERED в * N.

Спасибо за любую помощь, я новичок в этом и у меня кончаетсяидей !!:)

Огромное спасибо всем, моей проблемой было форматирование моего вложенного выбора, но также и нечто совершенно иное.Я присоединился не к тому полю, поэтому не было совпадений, и именно поэтому я получал NULL!Еще раз спасибо !!

Вот окончательная версия.Я был бы открыт для некоторых предложений по оптимизации.В противном случае рад, что сделано!

    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')

Ответы [ 4 ]

9 голосов
/ 15 февраля 2012

Если вы оберните поле в функции, вам нужно будет впоследствии назвать его.

Измените LTRIM(F0005.DRKY), на LTRIM(F0005.DRKY) AS DRKY,

6 голосов
/ 15 февраля 2012

Вам нужно назвать свои вычисленные столбцы в отфильтрованной таблице.

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

6 голосов
/ 15 февраля 2012

В вашем вложенном запросе вы пропустили псевдоним для 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)

3 голосов
/ 15 февраля 2012

Вам действительно нужно переформатировать ваш вопрос, но я думаю, я знаю, где вы ошиблись.

Псевдоним вашей таблицы, 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 тыс. Строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...