使用CROSS APPLY

时间:2015-06-29 12:54:27

标签: sql-server cross-apply

我有车Car' s(ID)的表smallint,以及与每辆车有关的事件的另一张表。

现在我想获得按特定标准选择的汽车的最新活动,但这似乎不起作用。

当我有这样的查询来获取每辆车的最新事件时,它可以正常工作:

SELECT * FROM [dvm_data].[dbo].[Car] CD 
CROSS APPLY (
  SELECT TOP 1 * FROM [dvm_data].[dbo].[CarData] WHERE CarIndex = CD.ID) MD

另一方面,当我尝试在WHERE中使用SELECT限制汽车时,它不再有效:

SELECT * FROM [dvm_data].[dbo].[Car] WHERE ID > 100 CD 
CROSS APPLY (
  SELECT TOP 1 * FROM [dvm_data].[dbo].[CarData] WHERE CarIndex = CD.ID) MD

在这种情况下,我收到错误消息:

  

Msg 102,Level 15,State 1,Line 1   CD'附近的语法不正确。 Msg 102,Level 15,State 1,Line 3   MD'附近的语法不正确。

第一个查询本身运行正常:

SELECT * FROM [dvm_data].[dbo].[Car] WHERE ID > 100

我在这里缺少什么?通常使用CROSS APPLY的示例在第一个SELECT查询中没有WHERE,这是否意味着什么?

另一件事,如果我想在第一次查询中使用DISTINCT,找到具有某种类型事件的汽车,然后找到这些汽车的最新事件,该怎么办?它会是这样的,但这也行不通:

SELECT DISTINCT ID FROM [dvm_data].[dbo].[CarData] WHERE EventID = 32 CD 
CROSS APPLY (
  SELECT TOP 1 * FROM [dvm_data].[dbo].[CarData] WHERE CarIndex = CD.ID) MD

我想这应该很容易,但目前我遗漏了一些东西......

2 个答案:

答案 0 :(得分:7)

你的where子句位置错误!试试这个:

SELECT * FROM [dvm_data].[dbo].[Car] CD 
CROSS APPLY (
    SELECT TOP 1 * 
    FROM [dvm_data].[dbo].[CarData] 
    WHERE CarIndex = CD.ID
) MD
WHERE CD.ID > 100 

答案 1 :(得分:0)

实际上你已将where条款放在错误的地方,

SELECT * FROM [dvm_data].[dbo].[Car] CD 
CROSS APPLY 
(
  SELECT TOP 1 * FROM [dvm_data].[dbo].[CarData] WHERE CarIndex = CD.ID
) MD
WHERE ID > 100 

为了更好地理解语法,请参阅Select statement in Sql