伙计们。
我目前正在探索 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。
有谁知道原因可能是什么?
预先感谢您的帮助。
原因很简单,MySQL 没有实现FULL
外连接,只有LEFT
和RIGHT
。
您可以FULL
使用 a UNION
of aLEFT
和RIGHT
外连接来模拟连接:
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)
两个查询(UNION
和UNION 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)
归档时间: |
|
查看次数: |
18778 次 |
最近记录: |