【问题标题】:Using CROSS APPLY使用交叉应用
【发布时间】:2015-09-15 22:51:32
【问题描述】:

我有一张桌子 Car 和汽车 ID's (smallint),还有一张桌子,上面有与每辆车相关的事件。

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

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

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

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

消息 102,级别 15,状态 1,行 1 'CD' 附近的语法不正确。消息 102,第 15 级,状态 1,第 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

我想这应该很容易,但目前我缺少一些东西......

【问题讨论】:

  • 您的子查询有问题。您有前 1 名,但没有排序依据。这意味着您无法知道您将获得哪一行。在列列表中使用 * 是不好的做法。你应该明确你的列名并且只返回你需要的行。

标签: sql-server cross-apply


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    其实你把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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多