【问题标题】:Best way to 'flatten out' tables with relationship information?用关系信息“展平”表格的最佳方法?
【发布时间】:2016-08-08 13:59:49
【问题描述】:

我有一张表,Relationships,结构如下

Relationships 
------
Relationship Employer_ID Employee_ID
10000        10020       10021
10001        10019       10020
10002        10021       10018

雇主和雇员之间的关系由关系列唯一标识。一个雇员可以有多个雇主,一个雇主可以有多个雇员。每个人都有自己的唯一 ID,它可以在 Employer ID 和 Employee ID 字段中出现多次。

还有另一个表格,Review,结构也是如此。

Meetings Review 
------
Meeting   Attendee_ID
10000     10020     
10000     10019
10001     10018
10001     10021     

此表显示会议和与会者列表。只有两个人可以参加会议 - 对于会议,每个会议参加者在“参加者”字段中代表一次。参加者字段中的 ID 可以与关系表中雇主/雇员字段中的 ID 连接。

我希望得到如下结果集——其中每一行都是一个唯一的会议,我们通过使用两个单独的列(Employer_ID 和 Employee_ID)确定了两个会议参加者之间的关系。

Results
-----
Meeting Employer_ID Employee_ID 
10000   10019       10020
10001   10021       10018

我的问题是——从概念上讲,我将如何做这件事?

我最初的想法是我应该只在 Attendee_ID 上使用最大值和最小值,然后制作两个派生表——其中一个最大的参加者 ID (Attendee_1) 与 Employer ID 匹配,而最小 ID (Attendee_2) 匹配在员工 ID 上。然后,使用 UNION 查询将此结果集添加到另一个派生表中,其中最大参加者 ID (Attendee_1) 与 Employee ID 匹配,最小 ID (Attendee)2) 与 Employer ID 匹配。

这似乎给了我预期的结果,但有没有更好的方法来做到这一点?

【问题讨论】:

  • 您的会议似乎总是只有一名员工及其雇主的会议(这就是为什么您可以在每次会议上显示雇主和员工的原因)。那么,为什么您的会议表不只是每次会议都有一条记录和相应的关系编号呢?

标签: sql oracle


【解决方案1】:

如果每次会议只有两个元素,我认为最好的解决方案是第二个别名

Meetings Review 
------
Meeting   Attendee_ID
10000     10020     
10000     10019
10001     10018
10001     10021   

您可以通过这种方式获得单行的结果

select a.Meeting , a.Employer_ID b.Employer_ID 
from Review  a 
inner join Review b  on a.Meeting = b.Meeting  and a.Employer_ID != b.Employer_ID

【讨论】:

    【解决方案2】:

    从概念上讲,两个参加者之间的关系是由Relationships 表中的记录决定的——我认为你不能假设ID 的大小有什么神奇的意义。您的示例数据显示了这一点 - 10020 是 10021 的雇主,但 10021 是 10018 的雇主。

    所以,您正在寻找Meetings Review 中的记录

    meeting 列相同的地方,

    并且一个值与attendee_ID 是来自Relationshipsemployer 的记录匹配,

    另一个值匹配attendee_idemployeeemployee的记录,

    来自Relationships 的两条记录具有相同的Relationship 值。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2012-03-18
      • 2017-07-17
      相关资源
      最近更新 更多