2017-03-04 211 views
0

使用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")); 

返回内容: 李四|草莓

请问某种灵魂,请告诉我我失踪了什么?提前致谢!

回答

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

只返回订购草莓的顾客。你需要澄清一点,你也想要没有订购草莓的顾客。

这个问题是因为Customers表中的所有entrice都有可能的加入合作伙伴(即不是草莓,但其他),它们在您的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 by来使这个联合查询工作。

+0

已经尝试过。不起作用。返回一条记录:John Doe |草莓。 Orders.Order中没有符合“无效”标准的记录,至少在Access 2016中。 – jalong

+0

实际上,为什么我必须提供任何其他选择标准,因为左连接本身应该提供所有左表中的所有记录?这对此很奇怪。 – jalong

+0

我编辑了我的答案 – EliteRaceElephant

0

这里是我的意思。我假设你使用列名作为说明,否则名称[Order]是保留字,不应用于表/列名。

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