0

Union右外部結合はベン図の に似ていますよね?
つまり、 のすべての行と一致する行A right outer Join Bをすべて取得する必要があります。 何らかの理由で、次のことと混同しています: Assume table : BA

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た。 しかし、私はこれを取得します: partpartnum=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)   

余分な行が表示されるのはなぜですか? Orderwithpartnum=54の行を `part のすべての行に結合するのはなぜですか?

4

4 に答える 4

3

ここに画像の説明を入力

あなたのクエリは

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を参照してください。

詳しい説明は

お役に立てれば

于 2013-02-15T10:09:30.523 に答える
1

結合条件RIGHT JOINを使用する必要があるため、 whenで結合されたすべての行を取得します。の 1 つの行があり、その行は からのすべての行 (クロス結合) と結合されています。orderspartnum=54orderspartspartnum=54partnum=54parts

于 2013-02-15T09:57:51.613 に答える
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=54WHEREJOIN条件は通常、テーブルを接続するためのもので、WHERE通常はフィルター処理のためのものです。

于 2013-02-15T09:58:29.343 に答える
1

o.partnum = 54onを使用しON conditionているため、結果に余分な行が含まれています。

o.partnum = 54where句に条件を付ける必要があります。

これはどう

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;

編集 : この美しい記事を参照して、ON 句と Where に条件を付けると結果セットがどのように乱れるかを参照してください。

于 2013-02-15T09:58:53.163 に答える