0

我有以下内容:

 USE xxx
 GO

 SET ANSI_NULLS ON
  GO

  SET QUOTED_IDENTIFIER ON
  GO

 SET ANSI_PADDING ON
 GO

 CREATE TABLE [dbo].[branches](
     [branchNumber] [int] NULL,
     [isSub] [char](1) NULL,
     [masterBranch] [int] NULL
 ) ON [PRIMARY]

 GO

SET ANSI_PADDING OFF
GO

insert into branches 
values ( 115, 'Y', 900 ) 


insert into branches 
values ( 123, 'Y', 900 ) 

insert into branches 
values ( 150, 'Y', 900 ) 

insert into branches 
values ( 900, 'N', null ) 

insert into branches 
values ( 901, 'N', null ) 
 go 

我需要检查 a) 115 a isSub = Y 吗?如果是,那么我完成返回 115。 b) 900 是 IsSub = Y 吗?如果不是,我需要返回:115、123、150、900。c) 是 901 a isSub = Y?如果没有,我需要返回 901。

自从我查看 rank() 函数以来已经有一段时间了,所以我现在有点卡住了。任何帮助将不胜感激。谢谢

4

2 回答 2

1

所以你想知道的第一部分(A点和C点在这里相同)是“这个节点是别的东西的下属吗?” 这部分很简单,因为您已经在 DDL 中定义了它。

SELECT isSub FROM Branches WHERE branchNumber = @branchNumber

第二部分是“得到本的所有下属”。

如果您有 SQL 2005+ 这将涉及递归公用表表达式(CTE)。这使您可以处理您在此处列出的父/子关系类型。如果您可以忽略 JOINS,这些示例应该可以正确地指导您(与您不太复杂的需求相比,它们是额外的噪音)。

当您使用 SQL 2000 时,您将面临一个不太优雅的解决方案(其中有几个)。

  • 这个使用 SProc 递归但仅限于 32 级。
  • 这个以类似方式使用 UDF
  • 这个使用邪恶的 RBAR
  • ...如果您搜索“SQL 2000 递归查询”,还有许多其他人

如果第一部分为真,则执行第二部分并获取结果。

我建议您进行这些单独的存储过程或 SQL 调用。存储过程的返回值具有多种结构变化可能难以维护。

于 2012-11-21T17:50:42.627 回答
0

一个简单的工会似乎工作。

select distinct branchNumber as num from dbo.branches
where branchNumber = 900
union
select branchNumber as num from dbo.branches
where masterBranch = 900 
于 2012-11-21T20:53:01.580 回答