Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL自连接以获得结果_Sql Server_Tsql - Fatal编程技术网

Sql server TSQL自连接以获得结果

Sql server TSQL自连接以获得结果,sql-server,tsql,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

我运行以下查询

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实际上是一个父项,我需要在同一查询中引入此父项的所有子项

例如,如果我这样做:

Select * From Fstock where parentID = 31955
它返回它的3个子元素

GUID
31956
31957
31958
因此,有没有一种方法可以将这两个查询组合在一起,我只想使用
row_number()
函数返回固定数量的行,但是这些返回的行有时包含
父项
,我想在同一个查询中返回这些父项的子项

表演对我来说很重要

---编辑---- 我得到它来处理以下问题,有人有其他想法吗

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

这是粗糙的、未经测试的,但我相信您正在寻找一个递归公共表表达式(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
)

现在有人随时都会为你推出一个递归CTE:)啊,对不起。我所知道的解决这个问题的最佳方法是递归CTE,尽管其他人可能会提供满足该要求的替代方案。没有意识到你想避开CTE;可能想在你原来的帖子中提到这一点。介意我问你为什么要避开他们吗?很好的解决方案,看起来…你对CTE有什么看法!?!?他们是最优雅和最有效率的方法来解决这个问题……MARC,我也会考虑CTE解决方案,我不认为有任何其他做任何它。你看我使用ROWO编号()函数来控制我的网站的分页,我的表有数千行,我使用行数限制它们,而且行数内的顺序对我来说也很重要,如果CTE可以做到这一点,那就好了。只要我能以排序的方式返回正确的行集,我个人的建议是不要使用业务层元素来控制表示层元素;也就是说,不要使用SQL结构来控制web层显示数据的方式。我建议,如果你处理的问题太多,那么代码生成方的明智的WHERE子句应该是一个正确构建的存储过程,这可能是一个更好的路径。只是一个想法。