首页 > 解决方案 > Left Join with an Inner Join - 似乎无法获得正确的语法

问题描述

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

我已经尝试了查询的几种变体,但似乎无法正确。

我得到的最接近的是下面,但即使 LEFT OUTER JOIN PO_HEADER F 不符合条件,它也会返回 E.CASES_RECEIVED 。

 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
 ;

我已经尝试过这个查询,但由于 INNER 连接的括号而出现错误:

 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
 ;

任何有关如何使查询工作的帮助,将不胜感激。

标签: sqlleft-joininner-join

解决方案


最后一个查询中的括号应该没问题。您确定问题不是多余的=而不是括号吗?

如果 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

推荐阅读