2013-02-15 63 views
0

右外连接类似于维恩图的Union对吗?
我的意思是A right outer Join B我们应该得到B的所有行和A中的任何匹配行。
出于某种原因,我很困惑与以下:
假设表Orders不知道这个右外连接的结果是什么

mysql> select * from orders; 
+------------+------------+---------+----------+---------+ 
| orderedon | name  | partnum | quantity | remarks | 
+------------+------------+---------+----------+---------+ 
| 1996-05-19 | TRUE-WHEEL |  76 |  3 | PAID | 
| 1996-09-02 | TRUE-WHEEL |  10 |  1 | PAID | 
| 1996-06-30 | TRUE-WHEEL |  42 |  8 | PAID | 
| 1996-06-30 | BIKE SPEC |  54 |  10 | PAID | 
| 1996-05-30 | BIKE SPEC |  23 |  8 | PAID | 
| 1996-01-17 | BIKE SPEC |  76 |  11 | PAID | 
| 1996-01-17 | LE SHOPPE |  76 |  5 | PAID | 
| 1996-06-01 | LE SHOPPE |  10 |  3 | PAID | 
| 1996-06-01 | AAA BIKE |  10 |  1 | PAID | 
| 1996-07-01 | AAA BIKE |  76 |  4 | PAID | 
| 1996-07-01 | AAA BIKE |  46 |  14 | PAID | 
| 1996-07-11 | JACKS BIKE |  76 |  14 | PAID | 
| 1996-05-15 | TRUE-WHEEL |  23 |  6 | PAID | 
| 1996-05-30 | BIKE SPEC |  20 |  2 | PAID | 
+------------+------------+---------+----------+---------+ 
14 rows in set (0.00 sec) 

和表Part

mysql> select * from part; 
+---------+---------------+---------+ 
| partnum | description | price | 
+---------+---------------+---------+ 
|  54 | PEDALS  | 54.25 | 
|  42 | SEATS   | 24.50 | 
|  46 | TIRES   | 15.25 | 
|  23 | MOUNTAIN BIKE | 350.45 | 
|  76 | ROAD BIKE  | 530.00 | 
|  10 | TANDEM  | 1200.00 | 
+---------+---------------+---------+ 
6 rows in set (0.00 sec) 

我期待的是,下面的查询:
select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum o_partnum from part p right outer join orders o on o.partnum=54;
会给我所有的行Orders,只有part那行ve partnum=54
但我得到这个:

mysql> select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum o_partnum from part p right outer join orders o on o.partnum=54; 
+-----------+---------------+---------+------------+-----------+ 
| p_partnum | p_desc  | p_price | o_name  | o_partnum | 
+-----------+---------------+---------+------------+-----------+ 
|  NULL | NULL   | NULL | TRUE-WHEEL |  76 | 
|  NULL | NULL   | NULL | TRUE-WHEEL |  10 | 
|  NULL | NULL   | NULL | TRUE-WHEEL |  42 | 
|  54 | PEDALS  | 54.25 | BIKE SPEC |  54 | 
|  42 | SEATS   | 24.50 | BIKE SPEC |  54 | 
|  46 | TIRES   | 15.25 | BIKE SPEC |  54 | 
|  23 | MOUNTAIN BIKE | 350.45 | BIKE SPEC |  54 |  
|  76 | ROAD BIKE  | 530.00 | BIKE SPEC |  54 | 
|  10 | TANDEM  | 1200.00 | BIKE SPEC |  54 | 
|  NULL | NULL   | NULL | BIKE SPEC |  23 |  
|  NULL | NULL   | NULL | BIKE SPEC |  76 |  
|  NULL | NULL   | NULL | LE SHOPPE |  76 |  
|  NULL | NULL   | NULL | LE SHOPPE |  10 |  
|  NULL | NULL   | NULL | AAA BIKE |  10 |  
|  NULL | NULL   | NULL | AAA BIKE |  76 |  
|  NULL | NULL   | NULL | AAA BIKE |  46 |  
|  NULL | NULL   | NULL | JACKS BIKE |  76 | 
|  NULL | NULL   | NULL | TRUE-WHEEL |  23 |  
|  NULL | NULL   | NULL | BIKE SPEC |  20 |  
+-----------+---------------+---------+------------+-----------+ 
19 rows in set (0.00 sec) 

为什么我会得到额外的行?为什么它将Orderpartnum=54这一行合并到零件的所有行?

回答

1
FROM part p 
RIGHT OUTER JOIN orders o 
    ON o.partnum=54 

...只订购了一个条件,你需要补充的是一个条件,该部分也对应于订单或数据库将考虑任何部分匹配;

FROM part p 
RIGHT OUTER JOIN orders o 
    ON o.partnum=54 
AND o.partnum = p.partnum 

当然,如果你只想显示其中partnum = 54,你最好移动o.partnum=54WHERE条件,而不是行。 JOIN条件通常用于连接表,WHERE通常用于过滤。

+0

因此,当它与partnum 54有一排订单时,它就像笛卡尔产品一样? – Cratylus 2013-02-15 10:00:19

+0

是的,如果您没有任何指定o和p之间关系的连接条件,则会得到笛卡尔连接。 – 2013-02-15 10:01:16

1

因为你必须要RIGHT JOINorders加盟条件partnum=54你会得到所有行orders加入了与partspartnum=54。您有一行partnum=54,该行与parts的所有行(交叉连接)相连。

+0

因此,该行执行笛卡尔积? – Cratylus 2013-02-15 10:00:53

+0

是的。确切地说...... – 2013-02-15 10:01:27

1

您在ON condition上使用o.partnum = 54,这就是为什么你会在结果中获得额外的行 。

您需要将条件o.partnum = 54放在where子句中。

这个怎么样

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum o_partnum 
from part p right outer join orders o 
on o.partnum = p.partnum 
where o.partnum=54; 

编辑:您可参照本beautiful article结果集如何得到打扰当你在ON子句和Where 放状态。

3

enter image description here

您的查询

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum o_partnum 
from part p right outer join orders o on o.partnum=54; 

你要为右连接所以即使没有匹配的加盟表格右侧会显示记录,正是在这样的情况发生您的查询案例

同样是左连接所有表格的左边的记录即使不匹配也会显示

参考http://www.w3schools.com/sql/sql_join_right.asp

详细解释

希望这有助于

+0

+ 1.我喜欢你添加的维恩图 – Cratylus 2013-02-15 10:15:29

相关问题