admin

外连接中的AND语法?

sql

这只是我发现的一个大得多的查询中的一小部分。

除了主键,我正在尝试向外部联接添加过滤器。问题是我收到的状态代码不是0或1,就好像忽略了过滤器一样。

SELECT * 
FROM Products P
LEFT OUTER JOIN OrderDetails OD ON OD.SkuNum = P.SkuNum
LEFT OUTER JOIN OrderHeader OH ON (OD.ShipmentNum = OH.ShipmentNum
                               AND (OH.StatusCode = 0 OR OH.StatusCode = 1))
WHERE P.SkuNum = XXXX

请注意,如果我将该语句(OH.StatusCode = 0或OH.StatusCode =
1)放在where子句中,它将根据该条件过滤整个结果集,这也不是我想要的。

对于这种纯英语的加入,我想说的是“给我所有 此处未列出的 产品和其他 物品 。如果有该产品的任何装运,请给我提供装运状态为1或1的所有详细信息。
0“

我的语法错误还是我遗漏了一些东西?谢谢。

编辑:更新了查询以包括产品,以使其更清楚我在寻找什么并修复了转置错误。


阅读 158

收藏
2021-06-07

共1个答案

admin

通常,对于给定的OrderDetail,总会有一个OrderHeader,但是可能没有状态为0、1的OrderHeader。

通过左连接,您将获得该特定Sku的所有商品,然后,如果订单抬头的状态不为0、1,则这些列将为NULL

我认为您想要一个 INNER JOIN 。但这通常等同于将所有内容放在 WHERE中 ,因此我注意到您已经完全描述了想要到达这里的内容。

看到您的修改后,请尝试以下操作:

SELECT * 
FROM Products P
LEFT JOIN (
    SELECT OD.SkuNum, OD.ShipmentNum, etc.
    FROM OrderDetails OD
    INNER JOIN OrderHeader OH
        ON OD.ShipmentNum = OH.ShipmentNum
            AND (OH.StatusCode = 0 OR OH.StatusCode = 1)
) AS Orders ON Orders.SkuNum = P.SkuNum
WHERE P.SkuNum = XXXX
2021-06-07