Sql 上一个和下一个网关未正确显示
嗨,我有以下查询,这是一个显示1个项目的下一个网关信息的查询。 但我想将其作为CTE连接到另一个查询,但我需要更改此[Gateway].[ProjectFk]=744,因为744仅用于一行,每行都有一个不同的ProjectFk,我可以给CTE一个参数吗Sql 上一个和下一个网关未正确显示,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,嗨,我有以下查询,这是一个显示1个项目的下一个网关信息的查询。 但我想将其作为CTE连接到另一个查询,但我需要更改此[Gateway].[ProjectFk]=744,因为744仅用于一行,每行都有一个不同的ProjectFk,我可以给CTE一个参数吗 SELECT [Gateway].[ProjectFk],[GatewayTitle].[Title],[Gat_Date],[GatewayStatus].[Title] FROM [LocalGTPDatabase].[dbo].[Gatew
SELECT [Gateway].[ProjectFk],[GatewayTitle].[Title],[Gat_Date],[GatewayStatus].[Title]
FROM [LocalGTPDatabase].[dbo].[Gateway]
LEFT JOIN [LocalGTPDatabase].[dbo].[GatewayTitle] ON [GatewayTitle].[ID]=[Gateway].[Gat_TitleFk]
LEFT JOIN [LocalGTPDatabase].[dbo].[GatewayStatus] ON [GatewayStatus].[ID]=[Gateway].[Gat_StatusFk]
LEFT JOIN [LocalGTPDatabase].[dbo].[Project] ON [Project].[ID]=[Gateway].[ProjectFk]
WHERE [GatewayStatus].[Title]='Target' and [Gateway].[ProjectFk]=744
order by CONVERT(DATETIME, CASE WHEN ISDATE([Gat_Date]) = 1 THEN [Gat_Date] END) asc
但是,当我将此查询与其他信息相结合时,它不会显示数据,有时会显示数据,但不像我希望的那样多,我希望获得所有项目及其网关:
WITH
/****** Next Gateway ******/
MyCTE10 (ProjectFk, nextGatTitle, nextGatDate, nextGatStatus)as
(SELECT TOP 1 [Gateway].[ProjectFk],[GatewayTitle].[Title],[Gat_Date],[GatewayStatus].[Title]
FROM [LocalGTPDatabase].[dbo].[Gateway]
LEFT JOIN [LocalGTPDatabase].[dbo].[GatewayTitle] ON [GatewayTitle].[ID]=[Gateway].[Gat_TitleFk]
LEFT JOIN [LocalGTPDatabase].[dbo].[GatewayStatus] ON [GatewayStatus].[ID]=[Gateway].[Gat_StatusFk]
LEFT JOIN [LocalGTPDatabase].[dbo].[Project] ON [Project].[ID]=[Gateway].[ProjectFk]
WHERE [GatewayStatus].[Title]='Target'
order by CONVERT(DATETIME, CASE WHEN ISDATE([Gat_Date]) = 1 THEN [Gat_Date] END) asc ) ,
/****** Get all the links between projects and teams ******/
SELECT [LinkProject-Area].[ID] as [Link_ID],[LinkProject-Area].[ProjectFk] as [Project_ID],[Project].[GTDSnr] as [Proj_No],[Project].[Title]
, [MyCTE10].[nextGatTitle] as [Next Gateway], [MyCTE10].[nextGatDate] as [Next Gateway Date], [MyCTE10].[nextGatStatus] as [Next Gateway Status]
FROM [LocalGTPDatabase].[dbo].[LinkProject-Area]
LEFT JOIN [MyCTE10] ON [MyCTE10].ProjectFk = [LinkProject-Area].[ProjectFk]
WHERE [Project].[ID]>0
order by [Proj_No],[hasLead] desc
我做错了什么?这是因为极限一,但我如何克服这个问题?
我在我的CTE中选择项目的所有网关,然后我只收集第一个,当我单独这样做时,我可以添加一个WHERE[ProjectFk],我获得该项目的所有网关,如果我限制它,我可以获得我需要的网关,但因为我要获取所有项目,我需要从查询的该部分删除where projectFk=something,并在projectFk上加入它,但现在它不仅显示了两个日期,一个是下一个网关,一个是最后一个网关,因为有限制
解决了这个问题:我不认为您可以使用CTE来解决这个问题,但您必须使用用户定义的函数/将第一个查询放在projectFk是参数的函数中:
然后像这样加入他们:
外敷
dbo.LastGatewayAll([LinkProject Area].[ProjectFk])作为子广播网关
这将使您有可能获得如下数据:
子广播网关。[gateway]为[Last GW],子广播网关。[status]为[Last GW status],子广播网关。[Gat_Date]为[Last GW Date]
我希望这篇文章能更清楚地说明我想做什么…我认为你的问题太大,无法分析。你们能把你们认为不起作用的查询的相关部分放进去吗?我能看出上面的查询并没有使用Top子句和下面的查询并没有使用Top子句的区别。“MyCTE10(ProjectFk,NextGatitle,nextGatDate,nextGatStatus)”是什么意思?我真的不明白你在干什么。我很抱歉,好点了吗?还是不够精确?第一个查询是一个单独的查询,用于获取1个项目的下一个网关,在接下来的查询中,我尝试将该查询与我已经收集项目数据的查询连接起来,这是MyCTE10。但由于限制,我正在犯错误……在较低的查询[Gateway].[ProjectFk]=744中缺少此条件