2011-03-24 86 views
0

我:外連接幫助甲骨文

select title, order#, STATE 
from customers C, ORDERITEMS O, books b 
where b.ISBN=O.ISBN (+) 
order by title 

但我想明白爲什麼沒有訂單號行有狀態

BODYBUILD IN 10 MINUTES A DAY 1003 CA 
BODYBUILD IN 10 MINUTES A DAY 1003 WY 
BODYBUILD IN 10 MINUTES A DAY 1003 TX 
BODYBUILD IN 10 MINUTES A DAY 1003 NY 
BODYBUILD IN 10 MINUTES A DAY 1003 WA 
BODYBUILD IN 10 MINUTES A DAY 1003 ID 
BODYBUILD IN 10 MINUTES A DAY 1003 FL 
BUILDING A CAR WITH TOOTHPICKS - FL 
BUILDING A CAR WITH TOOTHPICKS - NJ 
BUILDING A CAR WITH TOOTHPICKS - GA 
BUILDING A CAR WITH TOOTHPICKS - MI 
+0

您確定訂單號碼真的是空的嗎?短劃線('-'字符)與'NULL'不同。除此之外:請說明從哪個表格中選取了三列。 – Arjan 2011-03-24 21:52:10

+0

@Arjan是的,我回滾了,我認爲OP與你同時編輯。我想我們會看到誰的回滾優先。 – 2011-03-24 21:52:12

+0

那麼我輸入什麼來格式化代碼呢? – user490735 2011-03-24 22:03:53

回答

3

您使用3個表,但只有一個連接。這會給你帶來太多的結果。您將需要兩個連接:可能以某種方式表客戶也需要與OrderItems連接。

喜歡的東西:

and o.customerId = c.id 

因此:如果在做外連接多個表涉及

select b.title, o.order#, c.state 
from customers c, orderitems o, books b 
where o.customerId = c.id 
and b.isbn = o.isbn (+) 
order by title 
4

我覺得輕鬆了許多使用ANSI聯接:

SELECT title, order#, STATE 
FROM customers c 
    JOIN orderitems O ON o.customer_id = c.id 
    LEFT JOIN books b ON b.isbn = o.isbn 
ORDER BY title 

(這與Arjan發佈的查詢基本相同,只是使用標準語法)

根據您的需要,您可能希望對訂購項目使用LEFT JOIN以及如果您還希望沒有訂單項的客戶

對於選擇列表中的列也使用表別名也是一種好的做法。這樣做會使聲明更容易理解(因爲您可以立即知道哪個列來自哪個表),並且對變化更穩定。

+0

在第三行也有'on',我想呢? – Arjan 2011-03-25 01:16:57

+0

@Arjan:謝謝!更正 – 2011-03-25 07:13:30