外联接中的AND语法?

时间:2011-09-08 14:15:10

标签: 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“

我的语法错了还是我错过了什么?感谢。

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

6 个答案:

答案 0 :(得分:1)

通过执行左连接,您表示您想要所有订单详细信息,其中skunum = xxxx,无论订单标头表中是否存在任何匹配项。

根据您的查询和简单的英文描述,对我而言,听起来你想要一个内部联接。但也许我不够了解或有足够的信息。内部联接仅返回货件状态为1或0且天坑匹配的所有订单详细信息。

答案 1 :(得分:1)

通常,您将始终拥有一个给定OrderDetail的OrderHeader,但您可能没有状态为0,1的

通过左连接,您将获得该特定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

答案 2 :(得分:1)

这里不需要派生表。

通过最后放置ON OD.SkuNum = P.SkuNum子句,产品上的LEFT JOIN在逻辑上最后发生。

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

答案 3 :(得分:0)

不确定这是否是您要找的:

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

您用简单的英语发表声明似乎认为您正在寻找特定货件。您可能希望将shippingnum添加到where子句。

答案 4 :(得分:0)

SELECT  *
FROM    Products P
        LEFT JOIN (
            SELECT  OD.*
            FROM    OrderHeader OH
                    INNER JOIN OrderDetails OD
                        ON OH.ShipmentNum = OD.ShipmentNum
            WHERE   OH.StatusCode IN (0,1)
        ) as orders    
            ON P.SkuNum = orders.SkuNum
WHERE    P.SkuNum = XXXX            

答案 5 :(得分:0)

试试这个:

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