使用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草莓
有些善良的灵魂请告诉我我失踪了吗?提前谢谢!
答案 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