【问题标题】:Left outer join with 2 column missing some output rows左外连接 2 列缺少一些输出行
【发布时间】:2016-05-14 08:35:47
【问题描述】:

当我从表 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')

【问题讨论】:

  • 是因为WHERE (Customer_Class_Price.ClassCode = '444-666')吗?你应该把它改成WHERE (Customer_Class_Price.ClassCode IS NULL OR Customer_Class_Price.ClassCode = '444-666')
  • 在我更改 where 子句后,它返回 138 行。仍然缺少 7 行。
  • 必须有 7 行连接到既不是 '444-666' 也不是 NULL 的 ClassCode。
  • 这就是为什么你应该将 where 条件移动到 join 子句

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


【解决方案1】:

通过将LEFT OUTER JOIN 表中的一列放入WHERE 子句中,您实际上已将其转换为INNER JOIN。您需要将其移至 JOIN 子句。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 此查询有效但我不明白为什么使用 CTE 可以解决此问题。你可以解释吗。非常感谢。
    【解决方案3】:

    您在 WHERE 子句中要求:

     (Customer_Class_Price.ClassCode = '444-666')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多