用关系信息'压平'表格的最佳方法是什么?

时间:2016-08-08 13:59:50

标签: sql oracle

我有一个表,关系,结构如此

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

其中雇主和雇员之间的关系由关系栏唯一标识。员工可以拥有多个雇主,雇主可以拥有多个雇员。每个人都有自己的唯一ID - 可以在雇主和员工ID字段中多次出现。

和另一张表,评论,结构如此。

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)匹配雇主ID和最小ID(Attendee_2)匹配的表在员工ID上。然后,使用UNION查询将此结果集添加到另一个派生表,其中最大与会者ID(Attendee_1)与员工ID匹配,最小ID(参加者)2)与雇主ID匹配。

这似乎给了我预期的结果,但是有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

从概念上讲,两个与会者之间的关系由Relationships表中的记录决定 - 我不认为你可以假设ID是大还是小都有一些神奇的含义。您的样本数据显示了这一点 - 10020是10021的雇主,但10021是10018的雇主。

因此,您正在寻找Meetings Review

中的记录

meeting列相同,

并且一个值与来自attendee_ID的{​​{1}}是employer的记录匹配,

,另一个值与Relationshipsattendee_idemployee的记录相匹配,

来自Relationships的两个记录都具有相同的Relationships值。