2016-01-06 208 views
0

我試圖在同一個查詢中使用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

回答

1

沒關係。

我上面的查詢在主查詢和CROSS APPLY查詢中都使用了相同的錶快捷鍵(vAH)。刪除交叉申請內的vAH可解決問題。