您好我有以下查询,这是一个显示 1 个项目的下一个网关信息的查询。但我想将此作为 CTE 加入另一个查询,但我需要更改此 [Gateway].[ProjectFk]=744 因为 744 仅适用于 1 行,每行都有不同的 ProjectFk,我可以给一个参数CTE?
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 中,但现在它不仅显示 2 个日期 1 用于下一个由于限制,网关和最后一个网关为 1,...
解决了它:我认为您不能为此使用 CTE,但您必须使用用户定义的函数/将第一个查询放在 projectFk 是参数的函数中:然后像这样加入它们:OUTER APPLY dbo.LastGatewayAll( [LinkProject-Area].[ProjectFk]) AS subLastGateWays 这将使您有可能获得如下数据:subLastGateWays.[gateway] as [Last GW],subLastGateWays.[status] as [Last GW Status],subLastGateWays。 [Gat_Date] 作为 [Last GW Date] 我希望这篇文章能更清楚地说明我想要做什么......