父,子和孤儿行的SQL自连接

时间:2013-05-10 11:29:55

标签: sql self-join

我不确定这里的程序是什么 - 这个问题几乎是this one的直接延续。但是,引入了一项新要求,可能需要完全不同的解决方案。 C'est la vie。

请参阅此新SQLFiddle

原始解决方案获取给定客户端ID的所有元素,除非该元素被“子元素”取代,如“父元素ID”所示。

适用于作为常规元素的子元素的客户端特定元素。

但是,我现在必须管理不是常规元素的子元素的客户端特定元素。并且原始查询不会获取它们。

我在表中添加了一个'NewThing'行 - 带有客户端ID且没有parent_element ID - 但是为了获取它,我必须与另一个select联合。我知道这可能不是最好的方法,但无法弄清楚如何修改原始查询。

因此,在上面的SQLFiddle中,我如何编写一个接受“客户端ID”参数(可能为NULL)的SQL查询并返回:

  • 对于客户端ID 1,第2,4和5行
  • 对于客户端ID 2,第3行和第4行
  • 对于客户端ID 42,第1行和第4行
  • 对于客户端ID NULL,第1行和第4行

1 个答案:

答案 0 :(得分:0)

为什么不这样简单:

SELECT  mm.*, md.label AS standardized_label FROM mytable md
LEFT JOIN
        mytable mc
ON      mc.parent_element = md.id
        AND mc.client = 1
JOIN    mytable mm
ON      mm.id = COALESCE(mc.id, md.id)
WHERE   md.client IS NULL or (md.client = 1 and md.parent_element IS NULL)