【问题标题】:Why can LEFT OUTER JOIN fail to work?为什么 LEFT OUTER JOIN 不能工作?
【发布时间】:2016-07-21 10:02:14
【问题描述】:

我有以下查询

SELECT COUNT(*) FROM Samples

返回628

以下查询时

SELECT * FROM 
  (

    SELECT
    sa.*, 
    tagLists.tagNames AS tagNames,
    tagLists.ProjectID AS ProjectID
      FROM Samples sa
        LEFT OUTER JOIN TagLists tagLists
          ON sa.spotID = tagLists.taggedItemID
          AND 6 = tagLists.taggedItemType
  ) ex

  WHERE ex.ProjectID IS NULL

返回空表。

换句话说,外连接查询

SELECT
        sa.*, 
        tagLists.tagNames AS tagNames,
        tagLists.ProjectID AS ProjectID
          FROM Samples sa
            LEFT OUTER JOIN TagLists tagLists
              ON sa.spotID = tagLists.taggedItemID
              AND 6 = tagLists.taggedItemType

不包含任何ProjectID 为空的行。

为什么? LEFT OUTER JOIN 不保证左表中的所有行都应该出现吗?

更新

抱歉,tagLists 中当然没有非空连接行。

更新 2

对不起,我是个傻瓜:确实有非空行我不在乎......

【问题讨论】:

  • 您没有向我们展示任何数据,使此评论具有推测性,但如果Samples 中的每条记录都与TagLists 中的记录匹配,那么ex.ProjectID 将永远不会是NULL,这将给出您当前的结果。

标签: mysql sql join left-join


【解决方案1】:

查询不返回数据的唯一情况是Samples 的每一行在TagLists 中都有满足连接条件的对应行,并且所有这些行在ProjectID 字段中都具有非NULL 值。换句话说,每个样本都有一个类型为 6 的标签列表项。

测试这一点的一个好方法是删除 WHERE 子句,并验证所有 628 行返回一个有效的 ProjectID

【讨论】:

  • 这听起来很像我的评论。给这个评论点赞怎么样?
猜你喜欢
  • 2012-02-18
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2012-06-13
  • 2013-03-10
  • 2018-02-09
相关资源
最近更新 更多