我已经设置了我的结构,以便任何条目都可以包含对另一个条目的引用,以填充缺少的详细信息。
ID, NAME, DESCRIPTION, REFERENCE
0, Stuff, Things, -1
1, , , 0
2, Things, Stuff, -1
我希望能够返回表的所有结果,如果条目需要引用另一个条目来完成数据,则用数据填充引用字段。我还想保留参考字段的原始ID。我还希望不需要引用的字段保持不变。
SELECT `ID`, `REFERENCE` FROM `details` as `t`
IF `REFERENCE` != -1 THEN
SELECT *, `t`.`REFERENCE` as `ORIGINAL_ID` FROM `details` WHERE `ID` = `t`.`REFERENCE`
ELSE
SELECT * FROM `details` WHERE `ID` = `t`.`ID`
显然这不起作用,但我只是想向你展示我认为我想要的东西。这可能吗?谢谢你的阅读。
答案 0 :(得分:1)
你可以接近这样的事情:
SELECT
t.ID,
t.Reference,
COALESCE(reffed.Name, t.name) AS name,
COALESCE(reffed.whatever, t.whatever) AS whatever,
COALESCE(... and so on ...)
FROM details t
LEFT OUTER JOIN details reffed ON t.Reference = reffed.id
如果有参考值,由于COALESCE
,它将优先于“基础”值。
如果Reference = -1
或Reference
未指向有效id
,则引用的值将为null,因此COALESCE
将返回“base”值({{ 1}}而不是t.whatever
)。
请注意,这假设您的实际行没有reffed.whatever
。
答案 1 :(得分:0)
我想你只想在left outer join
声明中使用select
和一些逻辑。
以下代码添加了两个新列。这些包含了它们从引用行(如果有)中提取的逻辑,然后是原始数据:
select d.*,
(case when Reference >= 0 then dref.name else d.name end) as UsedName,
(case when Reference >= 0 then dref.description else d.description end) as UsedDescription
from details d left outer join
details dref
on d.reference = dref.id