【问题标题】:What's the right kind of join?什么是正确的加入方式?
【发布时间】:2018-08-28 08:50:26
【问题描述】:

我有两张桌子:

产品

Id Integer
Name Character Varying(200)

订单

Id Integer
Product_Id integer
Started Timestamp

我需要同时获取所有带有产品 ID 和名称的订单。

我尝试过像这样使用内部连接:

select orders.id, orders.started, products.id, products.name
from orders inner join
     products
     on products.id = order.product_id

但它不显示一些没有产品链接的订单(服务订单)。 我做错了什么?

【问题讨论】:

  • 这是作业吗?
  • 不。我正在尝试开发一个简单的商店作为自我训练的尝试。
  • 表达式 order.product.id 可能会给您一个编译错误。它需要是 order.product_id
  • 是的.. 只是一个提示。我在一台电脑上写,在另一台电脑上测试。

标签: sql


【解决方案1】:

当您并不总是在第二个表上有元素时,您应该使用“左连接” -> 它会从左表中检索所有行,即使右表没有匹配的行。

像这样:

select orders.id, orders.started, products.id, products.name from orders 
left join products on products.id = order.product.id

【讨论】:

    【解决方案2】:

    您需要从 Orders 表中对 Product 表执行 LEFT JOIN。

    SELECT [Your Columns]
    FROM Orders o
         LEFT OUTER JOIN Products p ON o.ProductID = p.ID
    

    左连接仍将检索 Orders 中的所有行,并在匹配时从 Product 表中检索数据。当 Products 表中没有 ProductID 时,您尝试从 Products 表中提取的数据将只是 NULL。

    使用内连接要求两个表中都存在连接的列。例如,如果您有 Orders.ProductID = 7,则 Products 必须有 ID = 7 的行,否则您的查询将不会返回该 Order 的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-10-27
      • 2019-09-04
      • 2016-01-11
      • 2019-09-14
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多