多表上的SQL查询

多表上的SQL查询,sql,sql-server,algorithm,Sql,Sql Server,Algorithm,我在SQL方面没有太多经验,所以我认为这不是一个愚蠢的问题 我有两张这样的桌子 A。。G是层次结构的成员 现在我的要求如下 我需要过滤掉那些 成员表中的状态为0 但是,如果所选集合包含 父母有子女的子女 状态=0,忽略子项并 仅选择父级 例如,在上述情况下,状态为0的集合={B,C,D,E,F,G} 但C、D、E、F的父母身份为0。 所以我的结果应该是{B,G} 我可以使用SQL和相关技术来实现这一点吗?(即在数据库层。我不想查询数据结构,然后进行迭代。我可以为此编写一个查询吗?) 如果问题令

我在SQL方面没有太多经验,所以我认为这不是一个愚蠢的问题

我有两张这样的桌子

A。。G是层次结构的成员

现在我的要求如下

我需要过滤掉那些 成员表中的状态为0

但是,如果所选集合包含 父母有子女的子女 状态=0,忽略子项并 仅选择父级

例如,在上述情况下,状态为0的集合={B,C,D,E,F,G} 但C、D、E、F的父母身份为0。 所以我的结果应该是{B,G}

我可以使用SQL和相关技术来实现这一点吗?(即在数据库层。我不想查询数据结构,然后进行迭代。我可以为此编写一个查询吗?)

如果问题令人困惑,我将添加更多示例?

从成员m中选择m.ID
select m.ID from Members m
left join Relations r on r.Child = m.Id
left join Members p on r.Parent = p.Id
where m1.Status = 0 and p.Status <> 0
r上的左连接关系r.Child=m.Id 左连接成员p在r上。父=p.Id 其中m1.状态=0,p.状态0
但是我认为会有一个递归查询。

从成员m中选择m.ID
r上的左连接关系r.Child=m.Id
左连接成员p在r上。父=p.Id
其中m1.状态=0,p.状态0

但是我认为会有一个递归查询。

是的,您可以只使用SQL来做您需要的事情

由于父级和子级都必须具有状态0才能被考虑,让我重新表述您的查询:

返回状态为0且没有状态为0的父级的所有成员

有几种不同的方法可以编写如上所述的“notexists”查询。一个例子是:

select *
from Members
where ID not in (
    select Child
    from Relationships r join Members m on r.Parent = m.ID
)

如果您返回父母而不考虑其身份,事情会变得更复杂一些,但您不是。

是的,您可以使用SQL来做您需要的事情

由于父级和子级都必须具有状态0才能被考虑,让我重新表述您的查询:

返回状态为0且没有状态为0的父级的所有成员

有几种不同的方法可以编写如上所述的“notexists”查询。一个例子是:

select *
from Members
where ID not in (
    select Child
    from Relationships r join Members m on r.Parent = m.ID
)

如果你不考虑身份而回到父母身边,事情会变得复杂一点,但事实并非如此。

有趣的问题。现在,你关心整个关系树,还是只关心直系祖先?例如,如果祖父母(或曾祖父母等)的状态为0,您是否希望显示孩子?在您的示例中,假设除B=1和B=0之外的所有人;你想显示F,即使它有一个状态为0的祖先,在上面的几个级别吗?@Piskvor:如果在上面的示例中D=1,那么获得{B,G}就足够了。我不想因此得到{B,E,G}。(如果父项的状态为0,那么它应该在集合中,但不在其任何子项中。)不是答案,但将此与@gandjustas的答案结合,您将得到您需要的:有趣的问题。现在,你关心整个关系树,还是只关心直系祖先?例如,如果祖父母(或曾祖父母等)的状态为0,您是否希望显示孩子?在您的示例中,假设除B=1和B=0之外的所有人;你想显示F,即使它有一个状态为0的祖先,在上面的几个级别吗?@Piskvor:如果在上面的示例中D=1,那么获得{B,G}就足够了。我不想因此得到{B,E,G}。(如果父项的状态为0,则它应该在集合中,但不在其任何子项中。)不是答案,但将其与@gandjustas的答案相结合,您将得到所需的结果:这将只产生B。G仍然是状态为0的成员,我需要将其列出,因为它不是任何人的孩子。最好的方法是什么?只是“联合”ing?从成员中选择m.ID m左连接关系r on r.Child=m.ID左连接成员p on r.Parent=p.ID其中m.Status=0和p.Status 0联合从成员中选择ID,其中Status=0而非ID IN(从关系中选择子关系联合从关系中选择父关系)此答案完全不正确。左外联接是表示
不存在的一种方式
;但是,外部连接条件必须包括
p.Status=0
,并且
where
子句必须将结果限制为
p.Status为null
。是的,where子句中应该有m.Status=0和(p.Status 0或p.Status为null)。这将只导致B。G仍然是状态为0的成员,我需要将其列出,因为它不是任何人的孩子。最好的方法是什么?只是“联合”ing?从成员中选择m.ID m左连接关系r on r.Child=m.ID左连接成员p on r.Parent=p.ID其中m.Status=0和p.Status 0联合从成员中选择ID,其中Status=0而非ID IN(从关系中选择子关系联合从关系中选择父关系)此答案完全不正确。左外联接是表示
不存在的一种方式
;但是,外部连接条件必须包括
p.Status=0
,并且
where
子句必须将结果限制为
p.Status为null
。是的,where子句中应该有m.Status=0和(p.Status 0或p.Status为null)。