在同一个查询中同时使用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之间发生了某种交互,我缺少这种交互。
有人吗?
答
没关系。
我上面的查询在主查询和CROSS APPLY查询中都使用了相同的表快捷键(vAH)。删除交叉申请内的vAH可解决问题。
'CROSS APPLY'的行为类似于INNER JOIN,其中如果没有满足连接条件的记录,则不会返回任何内容。也许你正在寻找一个'OUTER APPLY',如果条件不符合,它将返回NULL值。 – Siyual
我可以尝试外部应用程序,但我知道当前交叉应用程序正在寻找的记录存在 - 我有它在不同的查询工作;这只是一个优化的尝试。 – Jimfletcha
有趣。我运行了OUTER APPLY,它将返回3个额外列的所有NULL值。为什么我获取NULL值... – Jimfletcha