2010-08-04 25 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子句。

相关问题