2012-02-15 490 views
4

我遇到了正确过滤我的表F0005的问题。我尝试过许多不同方式的查询。我想要完成的是在加入之前过滤F0005。LEFT JOIN嵌套Select语句

这就是我想如何过滤,结果是完美的表。

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不表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') 
+0

谢谢!添加AS允许它运行,现在我的问题是它没有做我想做的事情!发生了什么事是F0005对其他表中的某些代码进行了描述。当我这样做时,所有的描述都是NULL。 – jcervantes 2012-02-15 15:37:15

+0

一次一个一页地浏览您的查询。通过从一个小查询开始,然后添加连接,您可以看到非确定行为发生在哪一点。这个连接是你需要调查的。这些字段中的值是您期望的值吗? (例如,当您将ABAC15加入LTRIM(DRKY)时,您是否检查过实际上是否有任何匹配项,也许您还需要LTRIM(ABAC15)? – MatBailie 2012-02-15 16:10:05

+0

@jcevantes您说的描述是NULL,您确定那里是对你加入的记录的描述吗? – Taryn 2012-02-15 16:10:16

回答

9

如果你在一个函数中包装一个字段,你需要在之后命名它。

变化LTRIM(F0005.DRKY),LTRIM(F0005.DRKY) AS DRKY,

+0

非常感谢你的快速回答!任何想法为什么我会带来所有的空值?什么是排除故障的好方法? – jcervantes 2012-02-15 15:53:21

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 

EDIT

在响应于用户的问题。

为什么不让您的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 2012-02-15 15:45:09

+0

是的,我对JDE非常熟悉,因企业而异,个人而言,当我有严重的需求时,是非常有用的) 我想我不明白为什么你需要UDC表作为子选择。 – 2012-02-15 16:01:06

+0

当然,虐待解释。我Hav e我的FSALES是一个包含销售数据的自定义表。我加入了我的F0101和F4801,因为他们有工作类型代码和客户类型代码。 F0005有我的代码描述。所以我想加入,所以人们不必查看它们。我的问题是F0005似乎不仅仅是我需要的信息的UDC数据。所以当我做一个左连接时,它会带来很多额外的数据。 ON F0101.ABAC15 = F0005.DRKY我的行从70000到300000,因为DRKY中有很多重复项。 – jcervantes 2012-02-15 16:14:21