2010-08-04 41 views
0

我有一個相當傳統的一套訂單條目表除以的:JOIN不排除所有記錄,如果一邊是空

訂單 OrdersRows OrdersRowsOptions

在OrderRowOptions記錄不除非創建需要。當我創建一組聯接時,如

select * from orders o 
    inner join OrdersRows r on r.idOrder = o.idOrder 
    inner join ordersrowsoptions ro on ro.idOrderRow = r.idOrderRow 
where r.idProduct = [foo] 

如果給定產品不存在ordersrowsoptions記錄,那麼我的完整結果集爲空。

即使在其中一個連接子句中不存在任何記錄,返回記錄的正確語法是什麼?

thx

回答

3
select * from orders o 
    inner join OrdersRows r on r.idOrder = o.idOrder 
    left join ordersrowsoptions ro on ro.idOrderRow = r.idOrderRow 
where r.idProduct = [foo] 

當然,你不應該使用select *任何查詢,但從來沒有特別做一個連接時。重複的字段只是浪費服務器和網絡資源。

因爲你似乎不熟悉的左連接,你可能還需要了解這個概念: http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

1

LEFT JOIN/RIGHT JOIN

編輯:是的,下面的答案,前面給出的,是正確的:

select * from orders o 
    inner join OrdersRows r on r.idOrder = o.idOrder 
    left join ordersrowsoptions ro on ro.idOrderRow = r.idOrderRow 
where r.idProduct = [foo] 
+0

爲什麼-1,親愛的匿名破壞者?問題是:「即使在其中一個連接子句中沒有記錄,返回記錄的正確語法是什麼?」這裏的其他答案是相似的,但不是downvoted。 – Tobiasopdenbrouw 2010-08-04 15:07:19

+0

真的需要比這更多的信息。詳細說明你的答案。我沒有downvote,但我確實考慮過它。 :) – cHao 2010-08-04 15:07:25

+0

我輸入了更多答案,在打字過程中看到其他人給出了更完整的答案。我不想通過做一個快速編輯來「舀出」更完整的答案(這與我的答案完全相同)。但現在我會按照你的喜好編輯它。 – Tobiasopdenbrouw 2010-08-04 15:09:17

0

LEFT JOIN(或RIGHT JOIN)可能是你在找什麼,取決於哪一側連接沒有行可能會出現。

0

有趣的是,您是否想要獲得所有包含該產品的訂單?另一個帖子是正確的,你必須使用左或右外部連接。但是,如果你想獲得具有該產品的整個訂單,那麼你需要一個更復雜的where子句。

相關問題