【问题标题】:SQL Conditional joins, data inheritanceSQL 条件连接,数据继承
【发布时间】:2013-04-19 11:42:59
【问题描述】:

我需要实现一个数据继承逻辑,基于动态树,固定深度为3。

Output 1
--Output 1.1
--Output 1.2
----Ouptut 1.2.1
----Output 1.2.2
--Output 1.3
Ouput 2
-- Output 2.1
-- Output 2.2
-- etc.

所以我有一个对象定义如下:

Object
-id
-createdAt

以及附加到对象的数据

ObjectData
-owner_id (fk to the object)
-output_id (fk to the output)
-name (this is the real data)

我要做的是检索对象列表,根据 owner_id/ouput_id 内部加入 ObjectData,但如果不存在具有给定 output_id 的 ObjectData,则加入父输出的 ObjectData。

目前,在我的基本 SQL 查询中,如果 object_data 没有具有给定输出的条目,则不会返回它,这就是 INNER JOIN 的工作原理。

SELECT c.*, d.name FROM object c
INNER JOIN object_data d ON c.id = d.owner_id AND d.ouput_id = ?

我想要实现的是避免在数据完全继承时创建新的 object_data 条目,优化存储大小,并在添加新输出时避免大量插入。

我还必须能够对 object_data 字段的查询进行排序。

谢谢!

编辑: 感谢 Gordon Linoff,我认为 coalesce 是我的问题的解决方案,但根据 mysql doc,coalesce 将首先返回非 null。 就我而言,如果该行存在,我想返回它的值,无论它是否为空。

【问题讨论】:

    标签: sql join conditional


    【解决方案1】:

    我想我明白你想要什么。以下 SQL 同时加入对象数据和父对象数据,然后在 select 语句中进行选择:

    select o.*, coalesce(od.name, od_parent.name)
    from object o left outer join
         objectdata od_o
         on od_o.id = o.id left outer join
         objectdata od_parent
         on od_parent.id = o.parent_id
    

    这对数据库引擎来说似乎是不必要的努力。但是大多数引擎都针对将表连接在一起进行了高度优化,因此性能可能不是问题——尤其是如果您在表上有正确的索引。

    【讨论】:

    • 感谢您的回答,这似乎是一个很好的解决方案!如果存在一行,但值为空,会发生什么情况,它会返回父数据吗?这不是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2014-12-25
    • 2011-03-29
    相关资源
    最近更新 更多