如何在SQL查询中获取联接权限

Dav*_*ave 1 sql ms-access

我有两个表,如下:

人物:

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问题.

Joa*_*son 5

编辑: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,如果它不能找到一个匹配(就像你描述你想要的结果)