1

我有一个将几个表连接在一起的查询。

没有一个选定的列可以为空,那么最好的连接类型是什么???

这是查询:

SELECT ir.range_name, it.item_type, oi.itemQuantity, i.item_value
FROM orders o 
JOIN order_items oi ON oi.orderId = o.id 
JOIN items i ON i.id = oi.itemNumber
JOIN item_types it ON it.id = i.item_type
JOIN item_ranges ir ON ir.id = i.item_name
WHERE o.id = 1;

如果我已经设法得到正确答案,请告诉我!

4

2 回答 2

2

您使用的语法是INNER JOIN. 这种类型的连接返回每个表中的匹配行。

这意味着您必须确保您orders的行与 in 匹配order_items,然后您的order_items行必须与 匹配items,等等。如果不匹配,那么您将不会返回任何行。

所以你可能不得不使用 aLEFT JOIN代替。ALEFT JOIN将返回表中的所有行,orders即使它所连接的表中没有匹配的行。

SELECT ir.range_name, 
  it.item_type, 
  oi.itemQuantity, 
  i.item_value
FROM orders o 
LEFT JOIN order_items oi ON oi.orderId = o.id 
LEFT JOIN items i ON i.id = oi.itemNumber
LEFT JOIN item_types it ON it.id = i.item_type
LEFT JOIN item_ranges ir ON ir.id = i.item_name
WHERE o.id = 1;

如果您需要帮助学习正确的语法,这里有一个很好的 join 可视化解释。

注意:您也可以混合使用这些JOIN类型。因此,您可以在andINNER JOIN之间使用a ,然后在其他一些表上使用 a 。这实际上取决于您的数据以及您尝试返回的结果。ordersorder_itemsLEFT JOIN

于 2013-03-02T14:08:37.287 回答
1

您正在寻找的 JOIN 类型是LEFT JOIN.

解释它更短,INNER JOIN唯一检索在另一个表上具有至少一个匹配值的行。如果您要连接两个以上的表,则该行必须在每个表上至少有一个匹配项,以便记录显示在结果列表中。

但是,无论记录在其他表上是否没有匹配行,LEFT JOIN都会显示LeftHand Side ( table ) 表上的所有记录。ORDERS

SELECT  ir.range_name, it.item_type, oi.itemQuantity, i.item_value
FROM    orders o 
        LEFT JOIN order_items oi ON oi.orderId = o.id 
        LEFT JOIN items i ON i.id = oi.itemNumber
        LEFT JOIN item_types it ON it.id = i.item_type
        LEFT JOIN item_ranges ir ON ir.id = i.item_name
WHERE   o.id = 1

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-03-02T14:03:44.530 回答