为什么这个左连接查询会返回左表中的所有行?

时间:2017-03-04 21:00:39

标签: ms-access

使用MS-Access 2016.多年来一直涉足数据库,但严格来说是业余爱好者。我可能错过了一些明显的答案,但是我的所有"左连接只显示一行"搜索。在Paradox(DOS)中从未遇到过这个问题!这里有一些示例数据显示了我被卡住的地方。

Table 1 - Customers

CustID* | Name
1       | Jane Doe
2       | Jill Doe
3       | John Doe

Table 2 - Orders

OrderID* | CustID | Order
1        | 1      | Orange
2        | 1      | Banana
3        | 2      | Orange
4        | 2      | Apple
5        | 2      | Banana
6        | 3      | Apple
7        | 3      | Strawberry
8        | 3      | Banana

我想要一份显示他们是否有草莓的所有客户的列表。也就是说,结果应如下所示:

Name      | Order
Jane Doe  | (null)
Jill Doe  | (null)
John Doe  | Strawberry

我使用的查询是:

SELECT Customers.Name, Orders.Order
FROM Customers LEFT JOIN Orders ON Customers.CustID = Orders.CustID
WHERE (((Orders.Order)="Strawberry"));

它返回的是:     John Doe草莓

有些善良的灵魂请告诉我我失踪了吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

SELECT Customers.Name, Orders.Order
FROM Customers LEFT JOIN Orders ON Customers.CustID = Orders.CustID
WHERE (((Orders.Order)="Strawberry"));

仅返回订购草莓的客户。您需要澄清您还希望没有订购草莓的客户。

问题是因为Customers表中的所有entris都有可能的连接伙伴(即不是草莓而是其他东西),它们在LEFT JOIN中不会显示为NULL。因此,您需要再次查询未订购草莓的客户。

如果客户尚未订购任何产品,您还需要OR o.Order IS NULL

(SELECT c.Name, o.Order
FROM Customers AS c LEFT jOIN Orders AS o ON c.CustID = o.CustID
WHERE o.Order = 'Strawberry' OR o.Order IS NULL
GROUP BY c.Name, o.Order)

UNION

SELECT c.Name, null
FROM Customers AS c
WHERE NOT EXISTS (
  SELECT Orders.CustID 
  FROM Orders 
  WHERE c.CustID = Orders.CustID AND Orders.Order = 'Strawberry'
)

ORDER BY c.Name, o.Order

我认为Access数据库引擎会混淆您的标准SQL逻辑。我经常发现Access SQL特别麻烦。就像在这里一样,你必须使用group by和ordery来使这个联合查询工作。

答案 1 :(得分:0)

这就是我的意思。我假设您使用列名称进行说明,否则名称[Order]是保留字,不应用于表/列名称。

SELECT a.Name, b.[Order]
FROM Customers a
LEFT JOIN (SELECT * FROM Orders Where [Order] = 'Strawberry') b
 on a.CustID = b.CustID