欢迎投稿

今日深度:

MySQL Full Join的实现,mysqljoin

MySQL Full Join的实现,mysqljoin


MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
left join + union(可去除重复数据)+ right join

select * from A left join B on A.id = B.id (where 条件)
union
select * from A right join B on A.id = B.id (where条件);
 

mysql实现full join

Oracle 、DB2、SQL Server、PostgreSQL 支持 Full JOIN
但是 MySQL 是不支持的。
可以通过
LEFT JOIN + UNION + RIGHT JOIN 的方式 来实现。

下面是 测试表与测试数据
-- 学生表CREATE TABLE student ( SNO INT, SNAME VARCHAR(10), ICNO INT);-- 食堂IC卡表CREATE TABLE IC ( ICNO INT, ICNAME VARCHAR(10), ICMoney INT);INSERT INTO student VALUES(1, '张三', 1 );INSERT INTO student VALUES(2, '李四', 2 );INSERT INTO student VALUES(3, '王五', NULL);INSERT INTO IC VALUES(1, '张三', 500 );INSERT INTO IC VALUES(2, '李四', 250 );INSERT INTO IC VALUES(3, '赵老师', 600);

下面是 SQL Server 使用 full join 的结果
SELECT student.SNO, student.SNAME, IC.ICNAME, IC.ICMoneyFROM student FULL JOIN IC ON (student.ICNO = IC.ICNO);goSNO SNAME ICNAME ICMoney----------- ---------- ---------- ----------- 1 张三 张三 500 2 李四 李四 250 3 王五 NULL NULL NULL NULL 赵老师 600(4 行受影响)

下面是 MySQL 不支持 的输出结果:
mysql> SELECT -> student.SNO, -> student.SNAME, -> IC.ICNAME, -> IC.ICMoney -> FROM -> student -> FULL JOIN IC -> ON (student.ICNO = IC.ICNO);ERROR 1054 (42S22): Unknown column 'student.SNO' in 'field list'

下面是 MySQL 的 LEFT JOIN + UNION + RIGHT JOIN 的方式。
mysql> SELECT -> student.SNO, -> student.SNAME, -> IC.ICNAME, -> IC.ICMoney -> FRO......余下全文>>
 

mysql full join的问题

可以 A Left JOIN B UNION B Left JOIN A
也就是
SELECT ... FROM A LEFT JOIN B ON (关联条件)
UNION
SELECT ... FROM B LEFT JOIN A ON (关联条件)

注意:
这里的原理,是因为 UNION 操作, 会合并掉重复的。
前面的
A LEFT JOIN B , 包含了 A与B 都有的, 与 A 有 B 没有的。
后面的
B LEFT JOIN A, 包含了 A与B 都有的, 与 B 有 A 没有的。

UNION 处理以后,最后结果就是包含
A与B 都有的, 与 A 有 B 没有的。与 B 有 A 没有的。

但是, 如果你 A LEFT JOIN B 查询的时候, 查询本身就包含 重复记录的话, 那么这种 UNION 的方式恐怕没法使用了。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4131.html NewsArticle MySQL Full Join的实现,mysqljoin MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法left join union(可去除重复数据) right joinselect * from A left join B on A .id = B . id (where 条件) unionselect * f...
评论暂时关闭