外連線(outer join)示例

hrong1982發表於2008-01-20

SQL> select * from items;

PROD_ID PRODUCT_NAME PRICE
------- ------------ ------------
1 modem 2000.00
2 cpu 25000.00
3 cable 500.00
4 monitor 15000.00
5 keyboard 1000.00
6 pins 2000.00
7 soundcard 3000.00
8 lancard 1500.00
SQL> select * from orders;

ORDER_ID PROD_ID AMOUNT
-------- ------- ------
200 2 5000
215 3 4000
256 5 5000
265 5 1000
276 4 45000
212 1 6000
245 6 10000
249 5 2000
250 9 1000
自然連線(natural join) :
SQL> select * from items natural join orders;

PROD_ID PRODUCT_NAME PRICE ORDER_ID AMOUNT
------- ------------ ------------ -------- ------
1 modem 2000.00 212 6000
2 cpu 25000.00 200 5000
3 cable 500.00 215 4000
4 monitor 15000.00 276 45000
5 keyboard 1000.00 256 5000
5 keyboard 1000.00 265 1000
5 keyboard 1000.00 249 2000
6 pins 2000.00 245 10000
自然連線基於兩個表中相同的列prod_id返回該列值匹配的行。
上例中prod_id=7,8,9的記錄沒有返回。
完全外連線(full outer join) :
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from items i full outer join orders o on i.prod_id=o.prod_id;

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
---------- ------------ ---------- ----------
2 cpu 200 5000
3 cable 215 4000
5 keyboard 256 5000
5 keyboard 265 1000
4 monitor 276 45000
1 modem 212 6000
6 pins 245 10000
5 keyboard 249 2000
8 lancard
7 soundcard
250 1000
完全外連線返回兩個表中基於相同的列的值相同或不同的所有記錄.
左外連線left (outer join) :
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from items i left outer join orders o on i.prod_id=o.prod_id;

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
------- ------------ -------- ------
2 cpu 200 5000
3 cable 215 4000
5 keyboard 256 5000
5 keyboard 265 1000
4 monitor 276 45000
1 modem 212 6000
6 pins 245 10000
5 keyboard 249 2000
8 lancard
7 soundcard
左外連線返回join左邊表的所有列和右邊表中與左邊表匹配的列.
右外連線(right outer join) :
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from items i right outer join orders o on i.prod_id=o.prod_id;

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
------- ------------ -------- ------
1 modem 212 6000
2 cpu 200 5000
3 cable 215 4000
4 monitor 276 45000
5 keyboard 249 2000
5 keyboard 265 1000
5 keyboard 256 5000
6 pins 245 10000
250 1000
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from orders o left outer join items i on i.prod_id=o.prod_id;

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
------- ------------ -------- ------
1 modem 212 6000
2 cpu 200 5000
3 cable 215 4000
4 monitor 276 45000
5 keyboard 249 2000
5 keyboard 265 1000
5 keyboard 256 5000
6 pins 245 10000
250 1000
如上所示右外連線和左外連線作用相同.在這兩種外連線中改變任一種外連線的表的位置就可以得到與另一種外連線相同的結果.
左或右外連線也可用(+)表示,如下:
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from items i ,orders o where i.prod_id=o.prod_id(+);

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
------- ------------ -------- ------
1 modem 212 6000
2 cpu 200 5000
3 cable 215 4000
4 monitor 276 45000
5 keyboard 256 5000
5 keyboard 265 1000
5 keyboard 249 2000
6 pins 245 10000
7 soundcard
8 lancard
上例相當於基於items表的左外連線,在關聯條件中(+)在另一個表(orders)的一側;
SQL> select i.prod_id,i.product_name,o.order_id,o.amount from items i ,orders o where i.prod_id(+)=o.prod_id;

PROD_ID PRODUCT_NAME ORDER_ID AMOUNT
------- ------------ -------- ------
1 modem 212 6000
2 cpu 200 5000
3 cable 215 4000
4 monitor 276 45000
5 keyboard 256 5000
5 keyboard 265 1000
5 keyboard 249 2000
6 pins 245 10000
250 1000
上例相當於基於orders表的左外連線,在關聯條件中(+)在另一個表(items)的一側;
但(+)不能同時出現在兩側。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/795108/viewspace-997831/,如需轉載,請註明出處,否則將追究法律責任。

相關文章