全外连接对两个小表不起作用,错误 1064

que*_*ion 4 mysql join

伙计们。

我目前正在探索 MySQL 的功能,同时使用不同的查询做简单的练习。

我正在阅读以下文章,该文章解释了表 JOIN 的工作原理:

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

但是,我被困在 FULL OUTER JOIN 示例(由 tableA 和 tableB 组成):

表A:

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

mysql> select * from tablea;

+----+-----------+
| id | name      |
+----+-----------+
|  1 | Pirate    |
|  2 | Monkey    |
|  3 | Ninja     |
|  4 | Spaghetti |
+----+-----------+
Run Code Online (Sandbox Code Playgroud)

表B:

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

mysql> 从选项卡中选择 *

+----+-------------+
| id | name        |
+----+-------------+
|  1 | Rutabanga   |
|  2 | Pirate      |
|  3 | Darth Vader |
|  4 | Ninja       |
+----+-------------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试与网站上提出的相同:

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
Run Code Online (Sandbox Code Playgroud)

并收到错误 1064。

有谁知道原因可能是什么?

预先感谢您的帮助。

ype*_*eᵀᴹ 8

原因很简单,MySQL 没有实现FULL外连接,只有LEFTRIGHT

您可以FULL使用 a UNIONof aLEFTRIGHT外连接来模拟连接:

SELECT TableA.*, TableB.* 
FROM 
  TableA LEFT OUTER JOIN TableB
    ON TableA.name = TableB.name

UNION 

SELECT TableA.*, TableB.*
FROM 
  TableA RIGHT OUTER JOIN TableB
    ON TableA.name = TableB.name ;
Run Code Online (Sandbox Code Playgroud)

或(为了提高性能)使用UNION ALL

SELECT TableA.*, TableB.* 
FROM 
  TableA LEFT OUTER JOIN TableB
    ON TableA.name = TableB.name

UNION ALL

SELECT TableA.*, TableB.*
FROM 
  TableA RIGHT OUTER JOIN TableB
    ON TableA.name = TableB.name
WHERE 
    TableA.name IS NULL ;
Run Code Online (Sandbox Code Playgroud)

两个查询(UNIONUNION ALL)都将返回相同的结果。除非连接的结果不是唯一的(如果它产生 2 个或更多相同的行)。由于这个问题有SELECT *,所以SELECT a.*, b.*,要发生这种情况,表应该有重复的行,这是不太可能的(没有主约束或唯一约束的表。)


小智 7

在 MySql 中不存在 FULL OUTER JOIN 关键字

你可以试试这个:

SELECT * FROM TableA A
LEFT JOIN TableB B ON A.name = B.name
UNION
SELECT * FROM TableA A
RIGHT JOIN TableB B ON A.name = B.name
Run Code Online (Sandbox Code Playgroud)