Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server自连接存在问题_Sql_Sql Server_Join_Sql Server 2000_Rank - Fatal编程技术网

SQL Server自连接存在问题

SQL Server自连接存在问题,sql,sql-server,join,sql-server-2000,rank,Sql,Sql Server,Join,Sql Server 2000,Rank,我有以下资料: 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

我有以下资料:

 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=B=Y吗?如果是的话,那么我就完了。 b) 900 a是b=Y吗?如果没有,我需要返回:115123150900。 c) 901 a是否为B=Y?如果没有,我需要返回901

自从我研究rank()函数以来已经有相当长的一段时间了,所以我现在有点被卡住了。任何帮助都将不胜感激。 谢谢

所以您想知道的第一部分(这里的A点和C点相同)是“这个节点是其他节点的从属节点吗?”这一部分非常简单,因为您已经在DDL中定义了它

SELECT isSub FROM Branches WHERE branchNumber = @branchNumber
第二部分是“让所有的下属都参与进来”

如果您有SQL 2005+这将涉及(CTEs)。这允许您处理您在此处列出的父/子关系类型。如果您可以忽略连接(与您不太复杂的需求相比,它们是额外的噪声),那么这些示例将正确地指导您

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

  • 它使用存储过程递归,但限于32个级别
  • 以类似的方式使用UDF
  • 使用邪恶的RBAR
  • …如果您搜索“SQL 2000 “递归查询”
如果第一部分为true,则执行第二部分并获得结果


我建议您进行这些单独的存储过程或SQL调用。一个存储过程的返回值有多个结构变化,维护起来可能会有问题。

一个简单的联合似乎是可行的

select distinct branchNumber as num from dbo.branches
where branchNumber = 900
union
select branchNumber as num from dbo.branches
where masterBranch = 900 

这适用于任何特定版本的SQL吗?事实上,当使用
union
时,显式
distinct
是多余的:后者意味着前者。