如何在多对多关系上使用 ConcatRelated()

How to use ConcatRelated() on a many-to-many relationship

作为个人教育实验,我正在为一个想象中的动物收容所建立一个数据库。我对 SQL 和一般的数据库还很陌生。

任务:在动物收容所数据库中查找宠物的所有主人。

我有三个表:Pets、Owners 和 Pets2Owners。主人可以拥有一只或多只宠物,宠物可以有一个、多个或没有主人。表格如下所示:

Pets
+--------+----------+
| ID     | Name     |
+--------+----------+
|      1 | Opal     |
|      2 | Fuzzy    |
|      3 | Angel    |
|      4 | Peewee   |
|      5 | Spike    |
+--------+----------+

Owners
+----------+--------+
| ID       | Name   |
+----------+--------+
|        1 | Shy    |
|        2 | Belle  |
|        3 | Velvet |
|        4 | Brilla |
+----------+--------+

Pets2Owners
+----+--------+----------+
| ID | Pet_ID | Owner_ID |
+----+--------+----------+
|  1 |      1 |        2 |
|  2 |      2 |        1 |
|  3 |      3 |        1 |
|  4 |      5 |        3 |
|  5 |      5 |        4 |
+----+--------+----------+

因此,从 Pets2Owners,我们看到宠物 #3(天使)由主人 #1(害羞女士)所有,宠物 #5(斯派克)由主人 #3 和 4(Velvet 和 Brilla)所有), 宠物 #4 (Peewee) 无人拥有。

我在 SQL 方面没有经验,我不确定这是否可行,但是有没有一种方法可以进行一次查询,从而在不复制宠物的情况下为我提供有关宠物和主人的所有信息,例如这个:

+--------+--------+
|  Pets  | Owners |
+--------+--------+
| Opal   | Belle  |
| Fuzzy  | Shy    |
| Angel  | Shy    |
| Peewee | (none) |
| Spike  | Velvet |
|        | Brilla |
+--------+--------+

本质上,我想要一种将所有三个表中的信息合并为一个的方法。我尝试过使用连接,但它们给我留下了重复的条目(例如,Spike 有两行,一行与所有者 Velvet 相关,另一行与所有者 Brilla 相关)。

或者,是否可以查询 return 特定宠物的所有主人,如下所示:

Spike's Owners
+--------+
| Owners |
+--------+
| Velvet |
| Brilla |
+--------+

我可以使用它来实现相同的目标并列出特定宠物的所有主人(尽管我不确定 SQL 是否有变量可以让我对变量进行单个查询PetName,然后为任意名称重复它)

SELECT Pets.Name AS Pets, Owners.Name AS Owner
FROM Pets2Owner INNER JOIN Pets ON Pets2Owner.[Pet Id] = Pets.[id]
INNER JOIN Owners ON Pets2Owner.[Owner Id] = Owners.[id]

在你掌握了 JOINS 之后, 尝试查看 Access 的参数 :)

您可以使用 Allen Browne 的函数 ConcatRelated() 创建一行,如下所示:

| Spike | Velvet, Brilla |

ConcatRelated() 是为一对多关系设计的。由于您有多对多,因此您需要一个将宠物 ID 与主人姓名组合在一起的中间查询:

SELECT Pets2Owners.Pet_ID, Owners.OwnerName
FROM Pets2Owners INNER JOIN Owners ON Pets2Owners.Owner_ID = Owners.ID;

我将此查询称为 Pet_OwnerNames

那么ConcatRelated()就直白了:

SELECT Pets.PetName, 
       ConcatRelated("OwnerName", "Pet_OwnerNames", "Pet_ID = " & ID) AS Owners
FROM Pets;

结果:

+---------+----------------+
| PetName |     Owners     |
+---------+----------------+
| Opal    | Belle          |
| Fuzzy   | Shy            |
| Angel   | Shy            |
| Peewee  |                |
| Spike   | Velvet, Brilla |
+---------+----------------+