访问VBA在LEFT JOIN

时间:2016-06-27 20:48:52

标签: sql ms-access

我正在尝试运行查询以加入两个表,但是我需要先在Customer表上运行WHERE子句,然后JOIN操作应该在它之后运行,但我无法弄清楚如何执行此操作。我尝试了以下两个选项,但它仍然无效。第一个运行,但查询结果中没有记录。第二个没有运行,我得到一个不支持的#34; JOIN表达式。"信息。但是,当我删除" AND c.sales_group =" Investor Owned Util""它运行的线。我想要来自Customer表的所有记录,其中sales_group =" Investor Owned Util"然后从该查询我想用Orders表加入它并显示每个客户的所有订单。我需要WHERE子句首先运行的原因是我想要显示没有下订单的客户以及已下订单的客户。非常感谢任何帮助。

SELECT c.ship_to_party, c.ship_to_name, c.sales_group
FROM (SELECT * FROM Customer WHERE Customer.sales_group = "Investor Owned Util") AS c
LEFT JOIN Orders AS o
ON c.ship_to_party = o.order_ship_to_party
ORDER BY c.ship_to_name;

SELECT c.ship_to_party, c.ship_to_name, c.sales_group
FROM Customer AS c
LEFT JOIN Orders AS o
ON c.ship_to_party = o.order_ship_to_party
AND c.sales_group = "Investor Owned Util"
ORDER BY c.ship_to_name;

谢谢, 埃里克

1 个答案:

答案 0 :(得分:0)

将Customer.sales_group选择条件移动到WHERE子句中,而不是JOIN的一部分。这会保留您想要查看的客户集(因为Customers表位于联接的左侧)。

SELECT c.ship_to_party, c.ship_to_name, c.sales_group
FROM Customer AS c
LEFT JOIN Orders AS o
ON c.ship_to_party = o.order_ship_to_party
WHERE c.sales_group = "Investor Owned Util"
ORDER BY c.ship_to_name;

值得注意的是,此查询应该在功能上等同于您的第一个查询,尽管稍微清晰一些。如果你得到0结果,根据JNevill的评论,验证

SELECT *
FROM Customer
WHERE sales_group = "Investor Owned Util"

实际上是在返回结果。

最后,在执行LEFT / RIGHT JOIN时要小心,并根据第二个查询包含其他连接条件。我知道查询不会在你的情况下运行,但在其他DBMS中这个查询是有效的。有关查询评估方式的差异,请参阅示例1.2和1.3 here