sql - 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
;
任何有关如何使查询工作的帮助,将不胜感激。
解决方案
最后一个查询中的括号应该没问题。您确定问题不是多余的=
而不是括号吗?
如果 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
推荐阅读
- python - .XML 文件可以从 .txt 或 .py 中的变量设置值吗?
- ldap - AzureAD 组 objectid 的匹配 LDAP 属性
- canvas - Flutter - 在照片上绘图
- java - 我的应用程序无法在 java 8u231 上启动
- c++ - “c++ 完整指南”一书第 252 页的错字?
- sql-server - SQL Server 无法获取有关 Windows NT 组/用户 'DOMAIN\user_account' 的信息
- ios - 为什么使用 `didRemove [ARAnchor]` 的 `session` 方法从未为 `ARBodyTrackingConfiguration` 调用?
- c++ - 为什么对象初始化会跳过构造函数?
- python - 拟合 Keras 模型时抑制输出
- php - 我应该在我的 Laravel 应用程序中使用什么层或模式?