我有两个表,如下:
人物:
First_Name Last_Name
Bill Smith
David Williams
Fred Jones
Freda Jones
Jane Smith
John Smith
Peter Williams
Sally Williams
Run Code Online (Sandbox Code Playgroud)
宠物:
Species Title Owner
Dog Fido Jones
Cat Tibs Jones
Dog Jock Williams
Run Code Online (Sandbox Code Playgroud)
我知道这是一个奇怪的数据库设计,但请不要告诉我重新设计数据库.这是一个代表真实问题的例子,它更复杂,无法重新设计.
我正在尝试制定一个查询,它将为每个人返回一行,以及一个包含其Cat标题的列,如果他们没有猫,则为null(我使用的Title
是因为Name
保留字和Access抱怨).
我最接近的是:
SELECT People.*, Pets.Title
FROM People
LEFT JOIN Pets ON People.Last_Name = Pets.Owner
WHERE Pets.Species IS NULL OR Pets.Species = "Cat"
Run Code Online (Sandbox Code Playgroud)
然而,这并未列出威廉姆斯家族的任何行,因为他们拥有一只狗.
我已经将其标记为MS Access,因为我实际上使用的是Access 97(不要问!),但是,除了Access相当有限的Join工具之外,它应该是一个常见的SQL问题.
编辑:Access中的左连接语法导致故障,这意味着对于访问我们需要涉及子查询.这看起来像(未经测试的);
SELECT People.*, Pets.Title
FROM People LEFT JOIN
[SELECT Pets.* FROM Pets WHERE Pets.Species = 'Cat']. AS Pets
ON People.Last_Name = Pets.Owner
Run Code Online (Sandbox Code Playgroud)
- 原始答案 -
你似乎想要的是一个常规的左连接,另外一个条件是宠物需要成为一只猫;
SELECT People.*, Pets.Title
FROM People LEFT JOIN Pets
ON People.Last_Name = Pets.Owner AND Pets.Species = 'Cat'
Run Code Online (Sandbox Code Playgroud)
之所以不把猫条件的WHERE
条款是,where子句消除了所有非比赛,而把它的ON
条款,使得结果NULL,如果它不能找到一个匹配(就像你描述你想要的结果)