SQL:完全外连接不起作用[重复]

Posted

技术标签:

【中文标题】SQL:完全外连接不起作用[重复]【英文标题】:SQL: FULL Outer Join Not Working [duplicate] 【发布时间】:2015-07-17 11:52:35 【问题描述】:

我有两张桌子,一张是空的,另一张不是。

hugot_votes_stats:http://prntscr.com/72ft7d hugot_comment_stats:空

我知道我不能使用 Inner JOIN,因为它只会匹配 ON 部分中指定的值。在这种情况下,一张表没有任何价值。

SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
FULL OUTER JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

这是我想出的使用 FULL JOIN 的部分。我所期望的是,如果没有找到空表(在本例中为 comment_count),它将显示一个默认值(即:0)。

然而,如您所见,我收到了一个错误 1064 - 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以了解在附近使用的正确语法

【问题讨论】:

【参考方案1】:

MySQL 没有语法关键字FULL OUTER JOIN. 你必须使用 LEFT 和 RIGHT JOIN 的组合来获得完全连接。

SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
LEFT JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

UNION ALL 

SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
RIGHT JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

【讨论】:

【参考方案2】:

您可以使用这样的方式来显示您的信息:

SELECT  t0.hugot_id,
        t0.upvotes,
        ifnull(t1.comment_count,0) as commentcount
FROM
    hugot_votes_stats as t0
left join
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

【讨论】:

这就是我要找的。非常感谢。虽然 upvotes 也可以为空。但是 ifnull 函数是我需要的。【参考方案3】:

您收到该错误是因为 MySQL 不支持(或识别)FULL OUTER JOIN 语法。

但是,可以在 MySQL 中模拟 FULL OUTER JOIN。

我们实际上需要两个查询。

一个查询返回左侧表中的所有行。 (左外连接。)

我们需要附加第二个查询的结果,它看起来就像第一个查询一样,除了我们需要右侧的表作为驱动程序 em> 我们需要消除所有匹配的行(以避免重复在第一个查询中返回的行。)

我们使用 UNION ALL 集合运算符将第二个查询的结果附加到第一个查询中。

举个例子:

SELECT t0.hugot_id                     AS hugot_id
     , t0.upvotes                      AS upvotes
     , t1.comment_count                AS comment_count
  FROM hugot_votes_stats t0
  LEFT
  JOIN hugot_comment_stats t1
    ON t0.hugot_id = t1.hugot_id

 UNION ALL

SELECT t0.hugot_id                     AS hugot_id
     , t0.upvotes                      AS upvotes
     , t1.comment_count                AS comment_count
  FROM hugot_votes_stats t0
 RIGHT
  JOIN hugot_comment_stats t1
    ON t0.hugot_id = t1.hugot_id
 WHERE t0.hugot_id IS NULL

注意第二个查询的 WHERE 子句中的谓词。这会过滤掉所有找到匹配项的行。 (第一个查询已经返回了这些行;第二个查询使用“反连接”模式从 t1 返回不匹配的行。

【讨论】:

以上是关于SQL:完全外连接不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

左外连接不起作用

连接表SQL PHP中列的总和不起作用[重复]

在 Management Studio 中编辑后 SQL Server 视图不起作用

PHP- MySQL 数据库插入操作不起作用 [重复]

使用左外连接时 Oracle 分区修剪不起作用

在 hive 中使用 Null 检查的左外连接查询不起作用