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子句应该是一个正确构建的存储过程,这可能是一个更好的路径。只是一个想法。