读书人

请问两个SQL语句~

发布时间: 2012-02-22 19:36:55 作者: rapoo

请教两个SQL语句~~~
两个多对多关系的表:employer与employee 还有一个中间连接表:employment

mysql> desc employer;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| employerid | int(11) | | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+

mysql> desc employment;
+--------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+----------------+
| employmentid | int(11) | | PRI | NULL | auto_increment |
| startDate | datetime | YES | | NULL | |
| endDate | datetime | YES | | NULL | |
| employerid | int(11) | | MUL | 0 | |
| employeeid | int(11) | | MUL | 0 | |
+--------------+----------+------+-----+---------+----------------+

mysql> desc employee;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| employeeid | int(11) | | PRI | NULL | auto_increment |


| name | varchar(255) | YES | | NULL | |
| taxfileNumber | varchar(255) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+

为何执行以下两句查询之后的查询结果却大相径庭?望大家详细指点下!谢谢!
select * from employer er left join employment et on er.employerid = et.employerid right join employee ee on et.employeeid = ee.employeeid;

select * from (select * from employer er left join employment et on er.employerid = et.employerid) ss right join employee ee on ss.employeeid = ee.employeeid;


[解决办法]
以下全属猜测:
这个问题比较复杂。。。。主要是看语句执行的顺序,
第一句应该是先把employment和employee执行right join,在和employer进行left join
select * from employer er
left join employment et
right join employee ee on et.employeeid = ee.employeeid
on er.employerid = et.employerid

第二句先left join 可能就产生重复的employeeid。。。在right join可能数据条数会多。。。
select * from (select * from employer er left join employment et on er.employerid = et.employerid) ss right join employee ee on ss.employeeid = ee.employeeid;

select * 最好不要这么用。。。。
[解决办法]
猜测:
第一个SQL:可能是先将后面两个表先连接起来,将查询结果与第一个表连接.
而第二个SQL则是先连接前两个表.
[解决办法]
太复杂了,看到我头都大了。
[解决办法]
晕,我试了类似的SQL ,结果是一样的

读书人网 >C#

热点推荐