sql - 外连接中的 AND 语法?

标签 sql sql-server outer-join

这是我发现存在问题的一个更大查询的一小部分。

除了主键之外,我还尝试向外部联接添加一个过滤器。问题是我收到的结果的 StatusCode 不是 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 OR OH.StatusCode = 1) 放在 where 子句中,它将按该条件过滤整个结果集,这也不是我想要的。

对于这种简单的英语加入,我想说“给我所有产品和其他这里未列出的东西。如果该产品有任何发货,请给我所有详细信息货件状态为 1 或 0 的他们”

我的语法是错误的还是我遗漏了什么?谢谢。

编辑:更新了查询以包含产品,以便更清楚我要查找的内容,并修复了换位错误。

最佳答案

通常,对于给定的 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

关于sql - 外连接中的 AND 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349475/

相关文章:

sql - 如何验证格式为 MMM/DD/YY 或 MMM/DD/YYYY 的日期字段?

mysql - 在 LEFT JOIN 中使用 OR 条件

mysql - 根据其条目列值迭代行

php - 在请求其他数据时检索数据库信息

sql - 查找具有完全相同的子行集的 Sql 父行

具有 NUMERIC 类型字段的 SQL 查询

sql - 将字符串转换为具有非标准值的日期时间格式

python - 结合 np.equal 和 np.less 创建单个数据帧?

python - sqlalchemy 中的外连接

sql - 我们可以将额外的参数传递给 beego 路由器吗