订单总会有客户,不是吗?所以它不是左连接而是内连接。
将它们联系起来的是 customer_id。所以你的 SQL 很简单:
select o.order_number, o.customer_ID, o.address,
c.first_name, c.last_name
from orders o
inner join customer c on o.customer_ID = c.customer_ID;
实体关系:
订单客户
客户 ID 0...N >---+ 1 客户 ID
……
此 EF 关系来自 MS SQL Server 的示例数据库 Northwind。在该示例数据库中,就像您的数据库一样,有客户和订单。 Customers 和 Orders 表通过两个表中的 CustomerId 字段关联(它是 Customers 中的主键,Orders 表中的外键)。当您将其建模为实体关系时,您将得到上面的图表。客户实体有一个“订单”导航属性(通过 customerId)指向特定客户的订单。 Order 实体有一个指向其 Customer 的导航属性(同样通过 CustomerId)。关系是 1 到 0 或多 (1 - *),这意味着客户可能有 0 个或多个订单。
当您从客户一侧进行联接时,“如果您想查看所有客户,无论他们是否有订单”,您可以使用 LEFT 联接 - 0 个或多个订单。如果您只想查看那些带有订单的订单,那么您可以使用内部联接。
当您从订单一侧进行联接时,订单必须有一个客户,因此它不能是左联接。这是一个 INNER 连接。
您可以使用连接的 CustomerId 字段检查双方的关系。
您不会有“OrderId,CustomerId”的单独表,因为它不是多对多关系(这将是纯粹的冗余,并会产生规范化异常)。
希望现在更清楚了。