查询同一个表中的关系

时间:2014-02-17 08:46:20

标签: sql sql-server

我有一个entities表,可以使用第二个junction表彼此之间建立多对多关系。乍一看,设计可能看起来有缺陷,并为每种类型的实体建议一个单独的表。问题是,实体是通用的,完全是用户定义的。它们也可以完全临时连接,每个实体可以具有无限数量的连接。 这是我的表的简化示例:

Entities
------------
Entity  | Id | Type
-------------------
Event   | 1  | Request
Stroll  | 2  | Activity
Dinner  | 3  | Activity
Angela  | 4  | Person
Anders  | 5  | Person
Michael | 6  | Person

Junctions
----------------
Left    | Right
----------------
1       | 2    // Connect Request -> Stroll
2       | 4    // Connect Stroll -> Angela
1       | 3    // Connect Request -> Dinner
3       | 5    // Connect Dinner -> Anders
3       | 6    // Connect Dinner -> Michael

现在问我的问题:

我想从不同实体的观点来查询查询。假设我想查看请求,看看他们有哪些活动,以及参加每项活动的人员。我想得到这样的结果:

Request  | Activity | Person
-----------------------------
Event    | Stroll   | Angela
         | Dinner   | Anders
                    | Michael
例如,我也希望能够翻转硬币并查看人员并查看他们参加的请求,例如:

Person  | Request
-----------------
Angela  | Event
Anders  | Event
Michael | Event

如何编写查询来实现这样的结果,甚至可以使用当前结构?我花了很多时间在谷歌搜索和试验没有运气,我非常感谢任何帮助。

这是SQLFiddle

1 个答案:

答案 0 :(得分:1)

你就是这样做的

SELECT e1.Entity Request,
       e2.Entity Activity,
       e3.Entity Person
  FROM Junctions j1 
       JOIN Junctions j2 
            ON j1.`Right` = j2.`Left`
       JOIN Entities e1
            ON j1.`Left` = e1.Id
       JOIN Entities e2
            ON j1.`Right` = e2.Id
       JOIN Entities e3
            ON j2.`Right` = e3.Id;

SQLFiddle

为了帮助您理解 - 首先我加入Junctions就像这样:

SELECT j1.`Left` Request, 
       j1.`Right` Activity,  
       j2.`Right` Person  
  FROM Junctions j1 
       JOIN Junctions j2 
            ON j1.`Right` = j2.`Left`;

然后加入Entity,如您所见,替换Id。每个type一次。

但是,尽管如此,我仍然认为这种架构很糟糕,需要重新设计。