如何在多对多关系

时间:2017-06-27 01:00:37

标签: sql ms-access group-concat

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

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

我有三张桌子:宠物,主人和宠物爱好者。业主可以拥有一只或多只宠物,宠物可以拥有一个,多个或没有主人。表格如下所示:

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(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进行单个查询,然后重复它任意名称)

2 个答案:

答案 0 :(得分:0)

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的参数:)

答案 1 :(得分:0)

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

 project( test NONE)
 cmake_minimum_required(VERSION 3.0)
 enable_testing()
 set(ARG "-E;sleep;-10")
 # set(ARG "-E;sleep -10")  
 # set(ARG "-E sleep -10")
 add_test( NAME test
      COMMAND ${CMAKE_COMMAND} -DCMD=cmake -DARG=${ARG} -P test.cmake)

| Spike | Velvet, Brilla | 专为一对多关系而设计。由于您具有多对多,因此您需要一个将宠物ID与所有者名称组合在一起的中间查询:

ConcatRelated()

我调用了此查询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;