TSQL自联接以获得结果

时间:2012-10-03 19:49:24

标签: sql-server tsql

我运行以下查询

Select * From
(
Select 
    GUID,
    MFG_CODE,
    STK_NAME,
    parentid,
    masteritem,
    ROW_NUMBER() over(order by guid) r
 From Fstock Where MasterItem=1 OR isNull(parentID, '')=''
 ) a
 Where r between 4716 And 4716

我得到以下结果

GUID    MFG_CODE    parentid    masteritem  r
31955   369553         0            1       4717

正如您所看到的,GUID 31955实际上是parentITEM&我需要在同一个查询中引入这个父项的所有子项。

例如,如果我这样做:

Select * From Fstock where parentID = 31955

它返回3个孩子

GUID
31956
31957
31958

那么有没有办法将这两个查询组合在一起,我只想使用row_number()函数返回固定数量的行,但是这些返回的行有时包含Parent ITem,我想返回这些父项的子项也在同一查询中。

性能对我来说非常重要。

---编辑---- 我让它与以下查询一起工作,有没有人有其他想法?

With CTE

As
(

Select 
    GUID,
    Manufacturer,
    SELL_PRICE,
    MFG_CODE,
    parentid,
    masteritem,
    ROW_NUMBER() over(order by GUID) r
 From Fstock Where MasterItem=1 OR isNull(parentID, '')=''

 ) 

Select A.*,F.parentID From
(
 Select * From CTE
 Where r between 4717 And 6000  
) A
 Left join Fstock F on F.parentID = A.GUID
 Order by A.r

1 个答案:

答案 0 :(得分:0)

这是粗略的,未经测试,但我相信你正在寻找一个递归的公用表表达式(CTE),它将为你结合父子关系。现在,原则上,这并没有集成您提到的在返回“固定行数”方面的任何行限制,我不确定如何解释,但下面的基本查询应该是您的开始。

With Products(GUID, MFG_CODE,STK_NAME, parentid,masteritem)
as
(
    Select GUID,MFG_CODE,STK_NAME,parentid,masteritem
      from fstock
     where masteritem=1 OR isNull(parentID, '')=''
    Union all
    Select f.GUID,f.MFG_CODE,f.STK_NAME,f.parentid,f.masteritem
      from fstock f
      inner join products g
         on f.parentid=g.guid
)