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

时间:2016-01-06 15:10:15

标签: sql sql-server tsql join cross-apply

我试图在同一个查询中同时使用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之间发生了某种相互作用,我不知道。

任何?

1 个答案:

答案 0 :(得分:1)

没关系。

我上面的查询在主查询和CROSS APPLY查询中使用相同的表快捷方式(vAH)。删除Cross Apply中的vAH可以解决问题。