我试图在同一个查询中同时使用Left Join和Cross Apply并遇到困难。
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获取初始警报信息,并使用Cross Apply从v_AlarmHistory表中获取一些后续警报信息。
上面的查询返回我期望的记录,但是取消注释Cross Apply会导致没有记录返回。在Inner Join和Cross Apply之间发生了某种相互作用,我不知道。
任何?
答案 0 :(得分:1)
没关系。
我上面的查询在主查询和CROSS APPLY查询中使用相同的表快捷方式(vAH)。删除Cross Apply中的vAH可以解决问题。