左外连接有2列缺少一些输出行

时间:2016-02-04 16:12:14

标签: sql sql-server sql-server-2008

View Design

当我从表zvw_test中选择所有行时,它返回145行。 表Customer_Class_Price有160行。 当我尝试以2个条件连接这个2表时,它返回122行。 我不明白为什么它不从zvw_test返回所有行(145行) 因为我使用左外连接它应该从左表返回所有行。

谢谢。

 SELECT zvw_test.Goods_ID, 
        zvw_test.Thai_Name, 
        zvw_test.UM, 
        zvw_test.CBal, 
        Customer_Class_Price.ListPrice
   FROM zvw_test 
   LEFT OUTER JOIN 
        Customer_Class_Price ON zvw_test.Goods_ID = Customer_Class_Price.Goods_ID AND 
                                zvw_test.UM = Customer_Class_Price.UM
  WHERE (Customer_Class_Price.ClassCode = '444-666')

3 个答案:

答案 0 :(得分:3)

通过在LEFT OUTER JOIN子句中放置WHERE表中的一列,您已将其有效地转换为INNER JOIN。您需要将其移至JOIN子句。

答案 1 :(得分:2)

之前我遇到过这个问题,我用CTE来解决这个问题,比如:

WITH A AS
(
    SELECT Customer_Class_Price.Goods_ID, Customer_Class_Price.UM, Customer_Class_Price.ListPrice  
    FROM Customer_Class_Price
    WHERE Customer_Class_Price.ClassCode = '444-666'
)
SELECT zvw_test.Goods_ID, zvw_test.Thai_Name, zvw_test.UM, zvw_test.CBal, A.ListPrice
FROM zvw_test LEFT OUTER JOIN A 
ON zvw_test.Goods_ID = A.Goods_ID AND zvw_test.UM = A.UM

答案 2 :(得分:1)

您在WHERE子句中要求:

 (Customer_Class_Price.ClassCode = '444-666')

因此,您没有选择Customer_Class_Price.ClassCode IS NULL的行。如果没有相应的行,Customer_Class_Price.ClassCode将为NULL,但您将明确过滤掉这些行。