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を返す必要があります。

ランク()関数を見てからかなり時間が経っているので、今はちょっと行き詰まっています。どんな助けでもありがたいです。ありがとう

4

2 に答える 2

1

したがって、知りたいことの最初の部分(ここでは、ポイントAとCは同じです)は、「このノードは他のノードの下位にありますか?」です。その部分は、すでにDDLで定義しているので、十分に単純です。

SELECT isSub FROM Branches WHERE branchNumber = @branchNumber

2番目の部分は「これのすべての部下を取得する」です。

SQL 2005+を使用している場合、これには再帰的な共通テーブル式(CTE)が含まれます。これにより、そこにリストされている種類の親子関係を処理できます。JOINSを割り引くことができれば、例は正しくガイドするはずです(それほど複雑でないニーズと比較すると、余分なノイズがあります)。

SQL 2000を使用していると、あまり洗練されていないソリューションに直面します(そのうちのいくつかがあります)。

  • これはSProc再帰を使用しますが、32レベルに制限されています。
  • これは、同様の方法でUDFを使用します
  • これは邪悪なRBARを使用しています
  • ...「SQL2000再帰クエリ」を検索した場合は、他にも多数あります

最初の部分が真の場合、2番目の部分を実行して結果を取得します。

これらの個別のストアドプロシージャまたは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 に答える