Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 外部连接中的语法是什么?_Sql_Sql Server_Outer Join - Fatal编程技术网

Sql 外部连接中的语法是什么?

Sql 外部连接中的语法是什么?,sql,sql-server,outer-join,Sql,Sql Server,Outer Join,这是一个更大的查询的一小部分,我发现这是一个问题 除了主键之外,我正在尝试向外部联接添加筛选器。问题是,我收到的结果的状态码不是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

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

除了主键之外,我正在尝试向外部联接添加筛选器。问题是,我收到的结果的状态码不是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或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)

你用通俗易懂的英语说的话似乎表明你在寻找一批特定的货物。您可能希望向where子句中添加shipmentnum。

通过执行左联接,您表示您希望所有订单详细信息,其中SKNUM=xxxx,而不管订单标题表中是否有匹配项


根据您的查询和简单的英语描述,对我来说,听起来您想要一个内部连接。但也许我没有足够的理解或有足够的信息。内部联接将仅返回装运状态为1或0且skunum匹配的所有订单详细信息。

通常,对于给定的OrderDetail,您将始终具有OrderHeader,但可能没有状态为0、1的OrderHeader


通过左连接,您将获得该特定Sku的全部,然后如果订单标题没有状态0、1,则这些列将为
NULL

我认为您需要一个内部联接。但这通常相当于将所有内容都放在中的位置,因此我确信您在这里完全描述了您想要得到的内容

查看编辑后,请尝试以下操作:

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
试试这个:

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

这里不需要派生表

通过将
放在OD.SkuNum=p.SkuNum
子句的最后一位,产品上的
左连接逻辑上发生在最后一位

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'

也许我不明白,但你不应该扭转局面吗?如OrderHeader中所示,是否加入OrderDetails?你总是有一个标题,但只是有时候有细节,对吗?你的过滤器有输入错误吗?byStatusCode与StatusCode@rickythefox:只需将
LEFT
更改为
RIGHT
就更容易了。很抱歉,我要澄清一下,LEFT join是因为这是一个小查询的一部分,我可以从中获得所有产品的列表,无论这些产品是否属于订单的一部分。OrderDetails部分通常也在一个左连接中。不,这不是我想要的,因为它会过滤整个查询-我确实提到过这一点,但不确定它是否清晰。我最近的编辑可能有助于澄清。抱歉,我更新了查询,现在可能更清楚了,内部联接不是我需要的。是的,我确实得到了空值,在我的完整查询(太大,无法在此发布)中,我实际上在做求和并消除空值。我基本上只是将较大查询的一部分拉出并粘贴到这里,因为它是问题的根源。StatusCode筛选器未应用于联接。这导致了问题。这基本上就像分离出子查询,这将是我的后备计划。这是将其包含在原始查询中的一种更优雅的方式。谢谢@TerryR你可以用一个正确的连接使它变得更光滑。但我通常不麻烦。优化器将生成相同的执行计划,从左到右读取更好。您也可以通过对
子句上的重新排序来执行相同的操作。哇,在我多年的SQL工作中,我从未尝试过这样做-不幸的是,它的可读性不太好。我想您可以添加一些括号,但这样看起来就像Access用来生成的那些时髦的括号一样。@Cade-是的,肯定不是常见的东西。尽管您在回答中说了一些,但使用
右连接将更容易实现这一点。
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'