作为个人教育实验,我正在为一个虚构的动物收容所建立一个数据库。总的来说,我对 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(Angel)归所有者 #1(Shy 女士)所有,宠物 #5(Spike)由所有者 #3 和 4(Velvet 和 Brilla)以及宠物 # 拥有4 (Peewee) 不属于任何人。
我在 SQL 方面没有经验,我不确定这是否可行,但是有没有一种方法可以进行单个查询,从而在不复制宠物的情况下为我提供有关宠物和所有者的所有信息,如下所示:
+--------+--------+
| Pets | Owners |
+--------+--------+
| Opal | Belle |
| Fuzzy | Shy |
| Angel | Shy |
| Peewee | (none) |
| Spike | Velvet |
| | Brilla |
+--------+--------+
本质上,我想要一种将所有三个表中的信息合并为一个的方法。我曾尝试使用连接,但它们给我留下了重复的条目(例如,Spike 的两行,所有者 Velvet,另一行所有者 Brilla)。
或者,是否可以进行查询以返回特定宠物的所有所有者,如下所示:
Spike's Owners
+--------+
| Owners |
+--------+
| Velvet |
| Brilla |
+--------+
我可以使用它来实现相同的目标,并列出特定宠物的所有所有者(尽管我不确定 SQL 是否具有可以让我对变量 PetName 进行单个查询的变量,然后对任意名称重复它)
您可以使用 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 |
+---------+----------------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句