如何在多对多关系上使用 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 |
+---------+----------------+
作为个人教育实验,我正在为一个想象中的动物收容所建立一个数据库。我对 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 |
+---------+----------------+