在同一个查询中同时使用CROSS APPLY和INNER JOIN

问题描述:

我试图在同一个查询中使用Left Join和Cross Apply,并且遇到了困难。在同一个查询中同时使用CROSS APPLY和INNER JOIN

SELECT vAH.TagName, vAH.EventSTamp, -123 Value, vAH.Description, 
-- Ack.DateTime, Ack.UserFullName as AckUser, Ack.Description as AckComment, 
LEFT(vAH.TagName,9) + CONVERT(nvarchar(30),LLC.StartDateTime,113) as ObjName 
FROM WWALMDBArchived.dbo.v_AlarmHistory vAH 
--CROSS APPLY (
-- SELECT TOP 1 EventStamp as DateTime, UserFullName, Description 
-- FROM WWALMDBArchived.dbo.v_AlarmHistory vAH 
-- WHERE TagName = vAH.TagName 
-- AND EventStamp > vAH.EventStamp 
-- AND AlarmState IN ('ACK_RTN','ACK_ALM') 
-- ORDER BY DateTime, UserFullName, Description DESC 
-- ) Ack 
INNER JOIN CPMS.dbo.LotListConfig LLC 
ON vAH.EventStamp >= LLC.StartDateTime 
AND vAH.EventStamp <= LLC.EndDateTime 
WHERE vAH.TagName LIKE @LineNumber + '%.Action_Alarm_ALM' 
AND LLC.LineNumber = @LineNumber 
AND LLC.LotNumber = @LotNumber 
AND vAH.AlarmState = 'UNACK_ALM' 

基本上我在做什么越来越从LotListConfig表边界信息,从v_AlarmHistory获得初始报警信息,并利用跨应用获得来自v_AlarmHistory表中的一些后续的报警信息。

上面的查询返回我期望的记录,但取消注释交叉应用不会导致记录返回。 Inner Join和Cross Apply之间发生了某种交互,我缺少这种交互。

有人吗?

+4

'CROSS APPLY'的行为类似于INNER JOIN,其中如果没有满足连接条件的记录,则不会返回任何内容。也许你正在寻找一个'OUTER APPLY',如果条件不符合,它将返回NULL值。 – Siyual

+0

我可以尝试外部应用程序,但我知道当前交叉应用程序正在寻找的记录存在 - 我有它在不同的查询工作;这只是一个优化的尝试。 – Jimfletcha

+0

有趣。我运行了OUTER APPLY,它将返回3个额外列的所有NULL值。为什么我获取NULL值... – Jimfletcha

没关系。

我上面的查询在主查询和CROSS APPLY查询中都使用了相同的表快捷键(vAH)。删除交叉申请内的vAH可解决问题。