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 “递归查询”
我建议您进行这些单独的存储过程或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
是多余的:后者意味着前者。