Sql 带有内部联接的左联接-似乎无法获得正确的语法
我正在使用HP NonStop Tandem数据库。我正在尝试编写一个查询,以提取生产信息,并包括采购订单信息(如果存在)。我遇到的问题是数据不存在或与标准不匹配。此外,采购订单信息位于两个不同的表上—标题表和明细表。我需要将产品与明细表匹配,获取采购订单号,然后返回标题信息,但前提是标题上的采购订单状态小于40 我尝试了几种不同的查询,但似乎都不正确 我得到的最接近值如下,但它将返回接收到的E.CASES\u,即使左侧外部连接PO\u头F不符合标准Sql 带有内部联接的左联接-似乎无法获得正确的语法,sql,left-join,inner-join,Sql,Left Join,Inner Join,我正在使用HP NonStop Tandem数据库。我正在尝试编写一个查询,以提取生产信息,并包括采购订单信息(如果存在)。我遇到的问题是数据不存在或与标准不匹配。此外,采购订单信息位于两个不同的表上—标题表和明细表。我需要将产品与明细表匹配,获取采购订单号,然后返回标题信息,但前提是标题上的采购订单状态小于40 我尝试了几种不同的查询,但似乎都不正确 我得到的最接近值如下,但它将返回接收到的E.CASES\u,即使左侧外部连接PO\u头F不符合标准 SELECT A.DISTRICT,
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;样本数据和预期结果将有所帮助。我还强烈建议您对表别名使用表缩写。它们更容易理解。毫无意义的字母是毫无意义的。