Sql 带有内部联接的左联接-似乎无法获得正确的语法

Sql 带有内部联接的左联接-似乎无法获得正确的语法,sql,left-join,inner-join,Sql,Left Join,Inner Join,我正在使用HP NonStop Tandem数据库。我正在尝试编写一个查询,以提取生产信息,并包括采购订单信息(如果存在)。我遇到的问题是数据不存在或与标准不匹配。此外,采购订单信息位于两个不同的表上—标题表和明细表。我需要将产品与明细表匹配,获取采购订单号,然后返回标题信息,但前提是标题上的采购订单状态小于40 我尝试了几种不同的查询,但似乎都不正确 我得到的最接近值如下,但它将返回接收到的E.CASES\u,即使左侧外部连接PO\u头F不符合标准 SELECT A.DISTRICT,

我正在使用HP NonStop Tandem数据库。我正在尝试编写一个查询,以提取生产信息,并包括采购订单信息(如果存在)。我遇到的问题是数据不存在或与标准不匹配。此外,采购订单信息位于两个不同的表上—标题表和明细表。我需要将产品与明细表匹配,获取采购订单号,然后返回标题信息,但前提是标题上的采购订单状态小于40

我尝试了几种不同的查询,但似乎都不正确

我得到的最接近值如下,但它将返回接收到的E.CASES\u,即使左侧外部连接PO\u头F不符合标准

 SELECT A.DISTRICT,
        A.PRODUCT_NUMBER,
        A.PRODUCT_DESC_LONG,
        B.UNITS_ON_HAND,
        E.CASES_RECEIVED,
        F.PO_NUMBER,
        F.PO_STATUS,
        F.SCHED_ARRIVAL_DATE
 FROM PRODUCT A
  LEFT OUTER JOIN WAREHOUSE B
     ON A.PRODUCT_NUMBER = B.PRODUCT_NUMBER 
   AND A.DISTRICT = B.DISTRICT 

  LEFT OUTER JOIN PO_DETAIL E
      ON A.PRODUCT_NUMBER = E.PRODUCT_NUMBER 
    AND A.DISTRICT = E.DISTRICT 
        AND E.PO_NUMBER > 899999999

  LEFT OUTER JOIN PO_HEADER F
             ON E.PO_NUMBER = F.PO_NUMBER 
             AND E.DISTRICT = F.DISTRICT 
                AND F.PO_NUMBER > 899999999
            AND F.PO_STATUS < '40' 
          WHERE A.DISTRICT = 2170 
            AND A.PRODUCT_NUMBER = 6849452
 ;
当我在下面尝试时,它作为where子句工作,当没有PO时,我不返回任何内容:

 SELECT A.DISTRICT,
        A.PRODUCT_NUMBER,
        A.PRODUCT_DESC_LONG,
        B.UNITS_ON_HAND,
        E.CASES_RECEIVED,
        F.PO_NUMBER,
        F.PO_STATUS,
        F.SCHED_ARRIVAL_DATE
   FROM PRODUCT A
  LEFT OUTER JOIN WAREHOUSE B
     ON A.PRODUCT_NUMBER = B.PRODUCT_NUMBER 
   AND A.DISTRICT = B.DISTRICT 

  LEFT OUTER JOIN PO_DETAIL E
      ON A.PRODUCT_NUMBER = E.PRODUCT_NUMBER 
    AND A.DISTRICT = E.DISTRICT 
        AND E.PO_NUMBER > 899999999
  INNER JOIN PO_HEADER F
             ON E.PO_NUMBER = F.PO_NUMBER 
             AND E.DISTRICT = F.DISTRICT 
            AND F.PO_NUMBER > 899999999
            AND F.PO_STATUS < '40' 
  WHERE A.DISTRICT = 2170 
    AND A.PRODUCT_NUMBER = 6849452
 ;
我已尝试此查询,但由于内部联接的括号而出现错误:

 SELECT A.DISTRICT,
        A.PRODUCT_NUMBER,
        A.PRODUCT_DESC_LONG,
        B.UNITS_ON_HAND,
        E.CASES_RECEIVED,
        F.PO_NUMBER,
        F.PO_STATUS,
        F.SCHED_ARRIVAL_DATE
   FROM PRODUCT A
  LEFT OUTER JOIN WAREHOUSE B
     ON A.PRODUCT_NUMBER = B.PRODUCT_NUMBER 
   AND A.DISTRICT = B.DISTRICT 
  LEFT JOIN (PO_DETAIL E
         INNER JOIN PO_HEADER F
             ON F.PO_NUMBER = E.PO_NUMBER 
            AND F.PO_NUMBER > 899999999
            AND F.PO_STATUS < '40' )
      ON A.PRODUCT_NUMBER = E.PRODUCT_NUMBER = 
     AND A.DISTRICT = E.DISTRICT 
     AND E.PO_NUMBER > 899999999
WHERE A.DISTRICT = 2170 
  AND A.PRODUCT_NUMBER = 6849452
 ;

如果您能为查询提供帮助,我们将不胜感激。

最后一个查询中的括号应该可以。你确定问题不是额外的=而不是括号吗

如果Tandem不支持括号,可以用子查询替换它们:

FROM PRODUCT A LEFT JOIN
     WAREHOUSE B
     ON A.PRODUCT_NUMBER = B.PRODUCT_NUMBER AND
        A.DISTRICT = B.DISTRICT LEFT JOIN
        (SELECT . . .  -- whatever columns you want
         FROM PO_DETAIL E JOIN
              PO_HEADER F
              ON F.PO_NUMBER = E.PO_NUMBER ANED 
                 F.PO_NUMBER > 899999999 AND
                 F.PO_STATUS < '40'
        ) EF
        ON A.PRODUCT_NUMBER = EF.PRODUCT_NUMBER AND
           A.DISTRICT = E.DISTRICT AND
           E.PO_NUMBER > 899999999

你在玩什么RMDB?MSSQL、MYSQL等,。此外,您是否能够发布表列定义?这样,再加上示例数据,就更容易解决了。您可以创建一个派生表并连接到它。。。必须缩短它-从A.PRODUCT\U NUMBER=B.PRODUCT\U NUMBER和A.DISTRICT=B.DISTRICT LEFT JOIN SELECT*从PO\U详细信息E内部JOIN PO\U标题F选择*从F.PO\U NUMBER=E.PO\U NUMBER和F.PO\U NUMBER>89999999和F.PO\U状态<'40'A.PRODUCT_NUMBER=e.PRODUCT_NUMBER=和A.DISTRICT=e.DISTRICT和e.PO_NUMBER>899999,其中A.DISTRICT=2170和A.PRODUCT_NUMBER=6849452;样本数据和预期结果将有所帮助。我还强烈建议您对表别名使用表缩写。它们更容易理解。毫无意义的字母是毫无意义的。