我正在尝试连接两个表(客户和订单)并检索客户名称及其订单 ID。但是,查询不会返回我期望的所有记录。这是我正在使用的查询
SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.country = 'USA';
问题是-
我希望此查询返回所有来自美国的客户及其相关订单。但是,输出似乎缺少我知道某些客户的
orders
表中存在的一些订单。没有错误信息,但结果集不完整。
电流输出-
只有至少下过一份订单的顾客才会被退回。结果中缺少尚未下订单的美国客户。
预期结果-
我希望查询返回来自美国的所有客户以及他们在orders
表中的
匹配的订单ID,即使他们还没有下任何订单。
我是否应该使用不同类型的联接(例如,
LEFT JOIN
)来包含没有订单的客户?
WHERE
条款是否会影响JOIN
行为,是否应该以不同方式进行过滤以包括来自美国的所有客户?
我如何修改此查询以确保列出所有来自美国的客户,即使他们没有订单?
您面临的问题是因为您使用的是 INNER JOIN,它仅返回两个表中匹配的行(即已下订单的客户)。这就是为什么结果中缺少未下订单的客户。
要包含来自美国的所有客户,即使是那些没有下过任何订单的客户,您也应该使用 LEFT JOIN 而不是 INNER JOIN。 LEFT JOIN将返回customers表中的所有记录,如果orders表中没有匹配的记录,则订单详细信息将返回为NULL。
选择客户.名称,订单.订单ID 来自客户 LEFT JOIN 订单位于customers.customer_id =orders.customer_id WHERE 客户.国家 = '美国';
LEFT JOIN 确保包含客户表中的所有客户,即使他们在订单表中没有任何匹配记录。 对于没有订单的客户,order_id 将返回 NULL,但客户的姓名仍会出现在结果集中。 此查询现在应返回所有美国客户,无论他们是否已下订单。