Sql 如何基于子表值映射同一表的行?

Sql 如何基于子表值映射同一表的行?,sql,oracle,select,join,stored-procedures,Sql,Oracle,Select,Join,Stored Procedures,我需要编写SQL来生成一个表或视图,该表或视图包含一个实体到另一个实体的映射,其中实体属于同一个表,并且映射条件基于其子对象的值。假设我有以下模式: 我需要能够在两个不同的实体ID之间创建映射,并根据以下条件将它们称为a和B: 类别。链接到实体A的人员的类别的名称值必须具有相同的类别。链接到实体B的人员的类别的名称值每个实体的验证名称必须匹配 链接到实体A的验证必须与链接到实体B的验证具有相同的验证值。两个实体的验证值必须匹配 VerificationType。链接到链接到实体A的验证的名称必须

我需要编写SQL来生成一个表或视图,该表或视图包含一个实体到另一个实体的映射,其中实体属于同一个表,并且映射条件基于其子对象的值。假设我有以下模式:

我需要能够在两个不同的实体ID之间创建映射,并根据以下条件将它们称为a和B:

类别。链接到实体A的人员的类别的名称值必须具有相同的类别。链接到实体B的人员的类别的名称值每个实体的验证名称必须匹配

链接到实体A的验证必须与链接到实体B的验证具有相同的验证值。两个实体的验证值必须匹配

VerificationType。链接到链接到实体A的验证的名称必须与VerificationType相同。链接到链接到实体B的验证的名称每个实体的验证类型必须匹配

最终结果将是类似以下的表格或视图:

entity_ID_A | entity_ID_B
--------------------------
1             2
3             4
11            10
为了简单起见,假设我们不能将多个值映射到实体_ID_A

在代码中,这可以简单地表示为:

Entity a, b = //do some stuff to get the two different entities
return a.person.name == b.person.name &&
    a.verification.verificationValue == b.verificationValue &&
    a.verification.verificationType.name == b.verification.verificationType.Name;

我甚至不知道从哪里开始在SQL中表达,更不用说生成一个满足此条件的实体ID映射表了。在进行任何比较之前,我是否将所有表连接在一起?任何指向正确方向的指针都将不胜感激。首先联接所有表,然后进行自联接:

with ents as (
    select e.id, c.name cname, v.verificationvalue vval, vt.name vname
      from entity e
      join person p on e.person_id = p.id
      join category c on c.id = p.category_id
      join verification v on v.id = e.verification_id
      join verificationtype vt on vt.id = v.verificationtype_id)
select a.id id_a, b.id id_b
    from ents a
    join ents b on a.id < b.id
               and a.cname = b.cname
               and a.vval = b.vval
               and a.vname = b.vname

好的,我缺少的是最后的自我连接。但是a.id