使用交叉应用

Using CROSS APPLY

我有 table CarID 的 (smallint),还有另一个 table 有与每辆车相关的事件。

现在我想获取按特定条件选择的汽车的最新事件,但这似乎不起作用。

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

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

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

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 Incorrect syntax near 'CD'. Msg 102, Level 15, State 1, Line 3 Incorrect syntax near '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

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

您的 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 

实际上你把 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