0

我需要实现一个基于动态树的数据继承逻辑,固定深度为 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 将返回第一个非空值。就我而言,如果该行存在,我想返回它的值,无论它是否为空。

4

1 回答 1

0

我想我明白你想要什么。以下 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

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

于 2013-04-19T13:17:50.380 回答