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

躯体

作为个人教育实验,我正在为一个虚构的动物收容所建立一个数据库。总的来说,我对 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 ConcatRelated() 和 2 Where 标准

Laravel:如何在多对多关系中使用where子句

如何在多对多关系 Laravel 中使用条件?

ConcatRelated()-查询或表

查询中的ConcatRelated函数

如何在Hibernate中使用增量管理多对多关系的版本历史记录?

如何在laravel中使用yajra数据表显示多对多关系的数据?

如何在laravel 8中使用不同的数据透视表播种多对多关系?

如何在多对多关系中使用 spring @RequestParam 获取对象数组?

如何在mongoDB中的多对多关系中使用嵌入式文档结构?

如何在Laravel中使用一对多关系?

laravel:如何在一对多关系中使用 wherePivot

如何在映射的超类中使用“成员输入”和多对多关系指定 JPA 标准 API?

当我在EF中使用多对多关系时,如何在视图中显示配方中的所有成分?

如何在Bookshelf.js中使用自定义字段名称创建多对多关系?

如何使用TypeORM查询多对多关系

在 Laravel 中使用 stock 属性设置多对多关系

在grails中的多对多关系中使用复选框

在Sequelize中使用具有多对多关系的AND运算

在实体框架中使用Fluent API创建多对多关系

如何在EF Core C#中使用Bogus为一对一和多对多关系生成测试数据?

如何在Webapi dotnet 3中使用IdentityUser将一个多对多关系添加到另一个实体

如何在Laravel 5.2中使用多对多态关系

如何在同一模型上强制使用多对多关系进行字段映射

使用SQL,如何在单个表多对多关系中查找不匹配项?

ConcatRelated()函数可在表单上提供唯一值

ConcatRelated函数和第五个参数

如何在Laravel中从多对多关系的一对多关系中获取项目?

如何在推进中从多对多关系中检索行?