如果一方为空,则JOIN不排除所有记录

时间:2010-08-04 15:00:17

标签: tsql

我有一套相当传统的订单输入表除以:

订单 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记录,则我的完整结果集为空白。

即使其中一个join子句中没有记录,返回记录的正确语法是什么?

THX

4 个答案:

答案 0 :(得分: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 :(得分: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] 

答案 2 :(得分:0)

LEFT JOIN(或RIGHT JOIN)可能就是你要找的东西,取决于连接的哪一侧不会出现任何行。

答案 3 :(得分:0)

有趣的是,您是否希望获得包含该产品的所有订单?另一篇文章是正确的,你必须使用LEFT或RIGHT OUTER JOINS。但是如果你想获得拥有该产品的整个订单,那么你需要一个更复杂的where子句。