【问题标题】:How to Map rows of same table based on child table values?如何根据子表值映射同一表的行?
【发布时间】:2017-09-21 19:46:29
【问题描述】:

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

我需要能够根据以下条件在两个不同的实体 ID(称为 A 和 B)之间创建映射:

  1. 链接到实体 A 的人员的 Category.Name 值必须与链接到实体 B 的人员的 Category.Name 值相同(“每个实体的验证名称必须匹配”)

  2. 链接到实体 A 的验证必须与链接到实体 B 的验证具有相同的验证值(“两个实体的验证值必须匹配”)

  3. 链接到实体 A 的验证的 VerificationType.Name 必须与链接到实体 B 的验证的 VerificationType.Name 相同(“每个实体的验证类型必须匹配”)

最终结果将是这样的表格或视图:

entity_ID_A | entity_ID_B
--------------------------
1             2
3             4
11            10

为简单起见,假设我们不能将多个值映射到 entity_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 映射表了。在进行任何比较之前,我是否将所有表格连接在一起?任何正确方向的指针将不胜感激

【问题讨论】:

    标签: sql oracle select join stored-procedures


    【解决方案1】:

    是的。先加入所有表,然后进行自加入:

    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 &lt; b.id的目的是什么?
    • 消除相同实体对 (1-1, 2-2...) 并且不显示它们两次 (1-2, 2-1, 3-4, 4-3.. .).
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多