使用交叉应用
Using CROSS APPLY
我有 table Car
和 ID
的 (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
我有 table Car
和 ID
的 (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