【问题标题】:SQL query with child table带有子表的 SQL 查询
【发布时间】:2019-02-17 15:13:01
【问题描述】:

我有两张表 Parent 和 Child。

父表有以下列

Parent_id,姓名

子表有以下列

Parent_id(外键),Identifier,identifier_value

现在我想列出不同的 parent_id,其名称和 identifier_value(子表)对于 Identifier = "test" 具有相同的 identifier_value 但对于 Identifier = "test1" 具有不同的 identifier_value

即考虑一个例子

父表---

Parent_id, Name
1, XYZ
2, PQR

子表

Parent_id, Identifier, Identifier_value
1, test, value1
1, test1, ghght 
2, test, value1
2, test1, khkhgj

输出应该是

1, XYZ, value1, ghght
2, PQR, value1, khkhgj

它应该返回上面例子的结果,如 parent_id 1 和 2,test 具有相同的值,但 test1 具有不同的值

这是我写到现在的内容

SELECT p.parent_id,
  p.name,
  eid.identifier_value,
  eid2.identifier_value
FROM parent p,
  child eid,
  child eid2
WHERE e.parent_id             = eid.parent_id
AND e.parent_id               = eid2.parent_id
AND eid.identifier  = 'test'
AND eid2.identifier = 'test1'
AND EXISTS
  (SELECT 1
  FROM child eid3
  WHERE eid3.identifier = 'test'
  AND eid3.value                    =eid.value
  AND eid3.parent_id             <> eid.parent_id
  AND EXISTS
    (SELECT 1
    FROM child eid4
    WHERE eid4.parent_id         = eid3.parent_id
    AND eid4.identifier = 'test1'
    AND eid3.value                 <> eid4.value
    AND eid4.identifier = eid3.identifier
    )
  )

最后一个子查询中的问题。需要一些建议。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这是你要找的吗?

    select p.*, c1.Identifier_value, c2.Identifier_value
    from parent p left join
         child c1
         on c1.parent_id = p.id and c1.identifier = 'test' left join
         child c2
         on c2.parent_id = p.id and c2.identifier = 'test2'
    where c1.Identifier_value <> c2.Identifier_value;
    

    【讨论】:

    • 不,标识符 test 应该有相同的 identifier_value 并且标识符 test1 应该有不同的标识符值。请您重新阅读我的问题。
    • @Sunny 。 . .这只是一个where 子句。
    • 每个父节点都有两个标识符 test 和 test1。我想列出那些对 test 具有相同 identifier_value 而对 test1 不同的父母。我希望这很清楚。感谢您的帮助
    • 恐怕您的查询给了我不正确的结果。您能否再次阅读我的问题,cmets 并查看我的查询,因为我确信我非常接近它。
    【解决方案2】:

    gordon 给出的查询有什么问题,下面是您提供的示例数据的结果。

    with parent_table as
    (
    select 1 as parent_id, 'XYZ' as name from dual
    union
    select 2 as parent_id, 'PQR' as name from dual
    ),
    child_table as 
    (
    select 1 as parent_id, 'test' as Identifier, 'value1' as Identifier_value from dual
    union
    select 1 as parent_id, 'test1' as Identifier, 'ghght' as Identifier_value from dual
    union
    select 2 as parent_id, 'test' as Identifier, 'value1' as Identifier_value from dual
    union
    select 2 as parent_id, 'test1' as Identifier, 'khkhgj' as Identifier_value from dual
    )
    select p.*, c1.Identifier_value, c2.Identifier_value
    from parent_table p left join
         child_table c1
         on c1.parent_id = p.parent_id and c1.identifier = 'test' left join
         child_table c2
         on c2.parent_id = p.parent_id and c2.identifier = 'test1'
    where c1.Identifier_value <> c2.Identifier_value;
    

    输出与问题中的预期输出相同。

    1   XYZ value1  ghght
    2   PQR value1  khkhgj
    

    【讨论】:

    • 最后一行的c1.identifier_value和c2.identifier_value是什么关系。他们是独立的
    • 您提到的问题 but different identifier_value for Identifier = "test1".. 以识别相同 id 的不同标识符值,我们有这个条件
    • 是的,这意味着对于 parentId 1 test1 应该有不同的值,但 test 应该有相同的值,你现在明白了吗?
    • 看我在问题中添加的查询,你就知道了
    • 您将测试标识符值与 test1 标识符值进行比较,但实际上它应该是 test identifier = test identfier (like p1 and p2) and test1 identifier test 1 identifier (like in P1 and P2 )。这个问题很简单。我不知道是什么导致了这里的混乱:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多