我有一套相当传统的订单输入表除以:
订单 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
答案 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子句。