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