2012-11-21 72 views
0

我有以下幾點:有與SQL Server自身問題加入

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 

我需要檢查 一)是115 isSub = Y?如果是,那麼我完成返回115. b)900是IsSub = Y?如果不是,我需要返回:115,123,150,900. c)是901 a isSub = Y?如果不是,我需要返回901.

自從我查看rank()函數以來,我已經有相當長的一段時間了,所以我現在有點卡住了。任何幫助將不勝感激。 謝謝

+0

這是否適用於任何特定版本的SQL? – StingyJack

回答

0

一個簡單的聯合似乎工作。

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

事實上,當使用'union'時顯式'distinct'是多餘的:後者意味着前者。 –

1

所以你想知道的第一部分(點A和C在這裏是相同的)是「這個節點是其他東西的下屬嗎?」該部分非常簡單,因爲您已經在DDL中定義了它。

SELECT isSub FROM Branches WHERE branchNumber = @branchNumber 

第二部分是「得到這個的所有下屬」。

如果您有SQL 2005+,這將涉及recursive common table expressions(CTE)。這允許您處理您在那裏列出的那種父母/子女關係。這些例子應該能夠正確引導你,如果你可以打折JOIN(它們與你不那麼複雜的需求相比是額外的噪音)。

由於您正在使用SQL 2000,因此您正面臨着不太優雅的解決方案(其中有幾個解決方案)。

  • This one使用SProc遞歸但限於32個級別。
  • This one,在類似的方式使用UDF
  • This one使用邪惡RBAR
  • ...和其他的主持人,如果你搜索「SQL 2000 遞歸查詢」

如果第一一部分是真的,然後執行第二個並得到結果。

我會建議你做這些單獨的存儲過程或SQL調用。存儲過程的返回值具有多個結構變化可能會有問題需要維護。

+0

我錯了,這是SQL Server 2000 ... – CFNinja