0

私のデータベースのテーブルには、以下のようなデータが保持されています。

                     TBLlocations
 -------------------------------------------------------
 LocationId    LocationName      RegisteredUnder    Type
 --------------------------------------------------------
  LOC100        Location1            0               0
  LOC201        Location2           LOC100           2
  LOC102        Location3           LOC201           1
  LOC302        Location4           LOC201           1
  LOC103        Location5           LOC201           1
  LOC104        Location6           LOC201           1
  LOC105        Location7           LOC104           1
  LOC106        Location8           LOC105           1
  LOC107        Location9           LOC106           1

ここで、クエリが最初のレベルの場所を返すように、上記のテーブルから場所を選択する必要があります。上記のテーブルを考慮すると、私のクエリは、タイプが「1」の場所を返す必要があり、タイプが「1」の最初のレベルの子の場所である必要があります。上記の表から、ロケーション 3 から 6 は第 1 レベルのロケーションであるため、クエリは次を返す必要があります。

---------------
   Location3 
   Location4 
   Location5 
   Location6

「タイプ」の条件を提供する同じテーブルに参加しようとしました。これは私が作成したクエリです:

Select Distinct t1.LocationId,t1.LocationName,t1.RegisteredUnder from TBLlocations t1
join TBLlocations t2 on t2.RegisteredUnder!=t1.LocationId
where t1.Type='1' and t2.Type='1'
order by t1.RegisteredUnder

上記のクエリは、以下に示すように、タイプ「1」のすべての場所を返しました。

--------------------------------------------------
LocationId     LocationName        RegisteredUnder
--------------------------------------------------
  LOC102        Location3           LOC201 
  LOC302        Location4           LOC201
  LOC103        Location5           LOC201
  LOC104        Location6           LOC201
  LOC105        Location7           LOC104 
  LOC106        Location8           LOC105
  LOC107        Location9           LOC106  

したがって、正確な結果を返すクエリが必要です。クエリで使用できる唯一のパラメーターは「タイプ」であり、常に「1」です。

PS: SQL Server 2008 を使用しています。

4

1 に答える 1

1

質問変更後

Declare @a table (LocationId Varchar(100),   LocationName Varchar(100),     RegisteredUnder Varchar(100),   Type int)
Insert into @a  Values('LOC100','Location1','0',0)
Insert into @a  Values('LOC201','Location2','LOC100',2)
Insert into @a  Values('LOC102','Location3','LOC201',1)
Insert into @a  Values('LOC302','Location4','LOC201',1)
Insert into @a  Values('LOC103','Location5','LOC201',1)
Insert into @a  Values('LOC104','Location6','LOC201',1)
Insert into @a  Values('LOC105','Location7','LOC104',1)
Insert into @a  Values('LOC106','Location8','LOC105',1)
Insert into @a  Values('LOC107','Location9','LOC106',1)
;With CTE as
(
Select 0 as level,* from @a where Type=1
UNION ALL
Select   c.Level+1, a.* from @a a
join CTE c on c.LocationId=a.RegisteredUnder and a.Type=1
)     
Select  c1.* from CTE c1
Left Join CTE c2 on c2.LocationId=c1.LocationId and c2.level>0
where c2.LocationId is NULL
order by LEVEL desc,LocationName

質問前の回答が変わりました

Declare @a table (LocationId Varchar(100),   LocationName Varchar(100),     RegisteredUnder Varchar(100),   Type int)
Insert into @a  Values('LOC100','Location1','0',0)
Insert into @a  Values('LOC201','Location2','LOC100',2)
Insert into @a  Values('LOC102','Location3','LOC201',1)
Insert into @a  Values('LOC302','Location4','LOC201',1)
Insert into @a  Values('LOC103','Location5','LOC201',1)
Insert into @a  Values('LOC104','Location6','LOC201',1)
Insert into @a  Values('LOC105','Location7','LOC104',1)
Insert into @a  Values('LOC106','Location8','LOC105',1)
Insert into @a  Values('LOC107','Location9','LOC106',1)
;With CTE as
(
Select 0 as level,* from @a where RegisteredUnder='LOC201'
UNION ALL
Select   c.Level+1, a.* from @a a
join CTE c on c.RegisteredUnder=a.LocationId
) 
Select DISTINCT * from CTE
where level<2
order by LEVEL desc, LocationName
于 2013-07-03T09:15:30.197 に答える