1

我设置了我的结构,以便任何条目都可以包含对另一个条目的引用以填写缺失的详细信息。

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`

显然那是行不通的,但我只是想向你展示我认为我想要的东西。这可能吗?谢谢阅读。

4

2 回答 2

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将返回“基本”值(t.whatever而不是reffed.whatever)。

请注意,这假设您没有实际的行 where details.id = -1

于 2013-04-26T14:12:28.053 回答
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
于 2013-04-26T14:05:17.603 回答